![]() |
UDP-Broadcasts und die Antwort darauf
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:
Der Server empfängt den Broadcast und soll darauf antworten:
//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;
Delphi-Quellcode:
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...
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; |
Re: UDP-Broadcasts und die Antwort darauf
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. |
Re: UDP-Broadcasts und die Antwort darauf
Zitat:
Zitat:
|
Re: UDP-Broadcasts und die Antwort darauf
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? |
Re: UDP-Broadcasts und die Antwort darauf
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.
|
Re: UDP-Broadcasts und die Antwort darauf
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. |
Re: UDP-Broadcasts und die Antwort darauf
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? |
Re: UDP-Broadcasts und die Antwort darauf
benutze die apifunktionen socket, bind, send/sendto, recv/recvfrom, close/closesocket
tutorials gibts genug in c oder auch fuer delphi (boardsuche) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz