Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi UDP-Broadcasts und die Antwort darauf (https://www.delphipraxis.net/56041-udp-broadcasts-und-die-antwort-darauf.html)

UGrohne 31. Okt 2005 03:49


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:
  //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...

ripper8472 31. Okt 2005 04:17

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.

UGrohne 31. Okt 2005 04:34

Re: UDP-Broadcasts und die Antwort darauf
 
Zitat:

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:

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.


ripper8472 31. Okt 2005 06:54

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?

UGrohne 31. Okt 2005 17:21

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.

neolithos 31. Okt 2005 22:38

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.

UGrohne 31. Okt 2005 22:45

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?

ripper8472 31. Okt 2005 23:16

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 16:06 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