AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi UDP-Broadcasts und die Antwort darauf
Thema durchsuchen
Ansicht
Themen-Optionen

UDP-Broadcasts und die Antwort darauf

Offene Frage von "UGrohne"
Ein Thema von UGrohne · begonnen am 31. Okt 2005 · letzter Beitrag vom 31. Okt 2005
Antwort Antwort
UGrohne

Registriert seit: 12. Dez 2002
Ort: Pliezhausen
65 Beiträge
 
Delphi 7 Professional
 
#1

UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 03:49
Moin Leute,
ich hab eben ein neues Projekt angefangen und schon ein Problem, wo ich wohl mal wieder auf dem Schlauch steh:

Ich hab einen UDPServer und einen UDPClient, jeweils in unterschiedlichen Progs in einem Thread. Der Client sendet nun einen Broadcast auf einem bestimmten Port und wartet auf eine Antwort:
Delphi-Quellcode:
  //locate server via UDP-Broadcast
  FIdUdpClient.Port:=19000;
  FIdUdpClient.Active:=true;
  FIdUdpClient.Broadcast(UDP_SRVLOC_REQ,UDP_COMM_PORT);
  resp := FIdUdpClient.ReceiveString(UDP_REC_TIMEOUT);
  if resp <> 'then begin
    //Server found
    ind := PosEx('=',resp);
    resp := Copy(resp,ind+1,Length(resp)-ind);
    //execute event
    if Assigned(FOnSWServerFound) then
      OnSWServerFound(resp);
    end;
Der Server empfängt den Broadcast und soll darauf antworten:
Delphi-Quellcode:
procedure TSWUdpServer.Execute;
var inctext, clientip: String;
    clientport: Integer;
begin
  FIdUdpServer.BroadcastEnabled := true;
  FIdUdpServer.DefaultPort := UDP_COMM_PORT;
  FIdUdpServer.Active := true;
  while not Terminated do begin
    FIdUdpServer.ReceiveString(clientip,clientport,UDP_REC_TIMEOUT);
    if inctext = UDP_SRVLOC_REQ then
      ResponseToSRVLOCREQ(clientip);
    end;
  { Thread-Code hier einfügen }
end;

//==================== Send response to server-locate-request ==================
procedure TSWUdpServer.ResponseToSRVLOCREQ(clientip: String);
begin
  FIdUdpServer.Send(clientip,UDP_COMM_PORT,UDP_SRVLOC_RSP+GetLocalIps.Strings[0]);
end;
UDP_REC_TIMEOUT ist auf 2000 eingestellt. Das Phänomen ist nun, dass der Server das Paket korrekt empfängt und darauf reagiert, d.h. die Prozedur ResponseToSRVLOCREQ wird ausgeführt und dort sollte ja eigentlich auch ein UDP-Paket an den Client geschickt werden. Nur kommt nix raus, mit Ethereal hab ich das mal gecheckt, es wird kein Paket gesendet...
Uwe
Lieber 3 Stunden Vorlesung, als gar kein Internetzugang
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#2

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 04:17
server empfangen, clients senden. das gilt fuer beide seiten.
kurz gesagt muessen beide seiten einen client und einen server haben.
vergiss nicht, udp ist ein verbindungsloses protokoll.
Christoph
  Mit Zitat antworten Zitat
UGrohne

Registriert seit: 12. Dez 2002
Ort: Pliezhausen
65 Beiträge
 
Delphi 7 Professional
 
#3

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 04:34
Zitat von ripper8472:
server empfangen, clients senden. das gilt fuer beide seiten.
kurz gesagt muessen beide seiten einen client und einen server haben.
vergiss nicht, udp ist ein verbindungsloses protokoll.
Aber im Falle der Indys haben doch beide Seiten sowohl Clients als auch Server die Möglichkeit Daten zu senden und zu empfangen. Oder wozu ist dann die Funktion send denn da?
Zitat von Indy-Hilfe:
Sends data to a remote computer system.

procedure Send(AHost: string; const APort: Integer; const AData: string);

Parameters

AHost: string

Address of the remote computer.

const APort: Integer

Port number on the remote computer.

const AData: string

Value to send to the remote computer.

Description

Send is a procedure used to send the data specified in AData to the remote computer system specified in AHost and APort. Send will resolve the address in AHost to a host name prior to sending AData to the remote system.

Send calls Binding.SendTo to transmit AData to the remote system. UDP does not guarantee delivery of data packets, so the values in AData may not arrive at the remote computer system.
Uwe
Lieber 3 Stunden Vorlesung, als gar kein Internetzugang
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#4

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 06:54
ich halte nichts von indy.
wenn du diese teile benutzen willst, halt dich an die doku.
ich fuer meinen teil nehm lieber die funktionen der socketapi (socket(), bind(), ...).

gilt dieses Send auch fuer server oder nur fuer clients?
Christoph
  Mit Zitat antworten Zitat
UGrohne

Registriert seit: 12. Dez 2002
Ort: Pliezhausen
65 Beiträge
 
Delphi 7 Professional
 
#5

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 17:21
Das gibt es auch für Server, sonst würde ja obiger Code nicht compiliert werden können. Ich habs auch gestern mal ausprobiert, in einer Beispielanwendung wird wohl ein UDP-Paket rausgeschickt (vom Server), aber in meinem Programm nicht, das finde ich etwas seltsam.
Uwe
Lieber 3 Stunden Vorlesung, als gar kein Internetzugang
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 22:38
Was man aber nicht machen sollte?

Folgendes Phänomen trat bei der Socket-API auf (das ist genau das was hinter den Indy-Componenten steckt - btw. ich bin auch nicht glücklich mit dieser Kapslung).

Wenn ich über den empfangenden Socket (Server), Packete gesendet habe und danach den Client geschlossen habe, kam beim Server die Fehlermeldung "Socket geschlossen". Seitdem verwende ich immer zwei Sockets, einem zum Senden und einem zum Empfangen.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
UGrohne

Registriert seit: 12. Dez 2002
Ort: Pliezhausen
65 Beiträge
 
Delphi 7 Professional
 
#7

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 22:45
Das ist aber seltsam, dass der Server reagiert, wenn der Client geschlossen wird. Schließlich ist UDP doch ein verbindungsloses Protokoll. Wie kriegt dann also der Server mit, dass der Client seinen Socket geschlossen hat, wenn er bei UDP doch nicht mal weiß, ob das Paket übertragen wurde.

Wie würde denn ein beispielhafter Code für nen UDP-Server/-Client aussehen für die Verwendung der SocketAPI?
Uwe
Lieber 3 Stunden Vorlesung, als gar kein Internetzugang
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#8

Re: UDP-Broadcasts und die Antwort darauf

  Alt 31. Okt 2005, 23:16
benutze die apifunktionen socket, bind, send/sendto, recv/recvfrom, close/closesocket
tutorials gibts genug in c oder auch fuer delphi (boardsuche)
Christoph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz