Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Udpsocket onReceive Ereignis wird nicht ausgelöst? (https://www.delphipraxis.net/116826-udpsocket-onreceive-ereignis-wird-nicht-ausgeloest.html)

richard_boderich 7. Jul 2008 11:08


Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Moin zusammen!

Ich habe hier ein kleines Problem mit der Udpsocket Komponente von Delphi7. Ich sende einen UDP Multikast und muss ein UDP Unicast Antwortpaket empfangen. Das Senden funktioniert und auch die Antwort kommt auch herein, (mit Wireshark überprüft) nur die Udpsocket Komponente löst kein
OnReceive aus! Kann mir jemand sagen warum? Gibt es vielleicht ein generelles Problem mit dieser Komponente?

mfG Richard


//EDIT

Also ich habe jetz mal ein wenig gegoogelt. Es scheint ein generelles Problem mit der UdpSocket Kompo zu geben. Auch der nicht feuernde OnReceive
Event wird dort erwähnt. Kennt jemand eine Quelle mit weiteren Infos bzw. einem Workaround ?

sirius 7. Jul 2008 12:26

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
TUDPSocket bietet ein derartiges Ereignis nicht an. onRecieve wird ausgelöst, wenn du selber RecieveFrom aufrufst. Workarounds fallen mir spontan einige ein. Neben "anderen Komponenten verwenden" wäre da noch:
- mit WSAAsyncSelect selber ein Ereignis erzeugen
- Die Komponente in einen Thread legen und blockierend recievefrom aufrufen
- RecieveFrom in einem Timer aufrufen und dabei die Komponente auf nichtblockierend schalten

richard_boderich 7. Jul 2008 12:55

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
@Sirius

Danke erstmal für deine Antwort. Funktioniert dies auch mit udpsocket1.ReceiveBuf()? Ich habe es damit versucht, jedoch leider ohne Erfolg.

mfG Richard

sirius 7. Jul 2008 13:51

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Ui, bei näherem hineinschauen in die Komponente kann ich kaum glauben, dass hier irgendetwas funktioniert :gruebel:

richard_boderich 7. Jul 2008 15:10

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
@Sirius

Kannst du bitte mal drüberschaun. onReceive wird trotzdem nicht gefeuert. Timer ist aktiv (10ms)!

mfG Richard

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  udpstream:TStringStream;
begin
getmem(buffer,8192);
udpstream:=TStringStream.Create(Suche+#13#10);
udpsocket1.SendStream(udpstream);
end;


procedure TForm1.UdpSocket1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin

label1.Caption:='fired';
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
bla:sockaddr_in;
data:integer;
begin
  bla:=udpsocket1.GetSocketAddr('192.168.0.1','0');
  udpsocket1.receivefrom(buffer,sizeof(buffer), bla, data, 0);
end;

sirius 7. Jul 2008 16:05

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Du kannst ja mal das onError-Event nutzen und dann den String SyserrorMEssage(SocketError) ausgeben.
Bei mir sagt er, dass es keiner VErbindung zum Remotehost gibt, was für ein UDP-Socket ja völliger Blödsinn ist.

Eigenartigerweise macht die Komponente ein Connect mit einem UDP Socket. Laut WinSDK ist das auch soweit ok, aber ein recv geht mit so einem Socket anscheinend nicht.

Was auch immer das uns sagen will:
Zitat:

Zitat von winSDK
For a connectionless socket (for example, type SOCK_DGRAM), the operation performed by connect is merely to establish a default destination address which will be used on subsequent send/WSASend and recv/WSARecv calls. Any datagrams received from an address other than the destination address specified will be discarded. If the address field of the name structure is all zeroes, the socket will be "dis-connected." Then, the default remote address will be indeterminate, so send/WSASend and recv/WSARecv calls will return the error code WSAENOTCONN. However, sendto/WSASendTo and recvfrom/WSARecvFrom can still be used. The default destination can be changed by simply calling connect again, even if the socket is already "connected". Any datagrams queued for receipt are discarded if name is different from the previous connect.


Ich schaue nachher nochmal genauer rein.

richard_boderich 7. Jul 2008 16:33

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Also die Receivefrom Funktion liefert bei mir immer -1 zurück. Ja, hab mich auch schon gefragt, was das mit connect, disconnect usw. soll. UDP sollte doch ein Verbindungsloses Protokoll sein!

mfG Richard

sirius 7. Jul 2008 20:10

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Ich würde sagen, schmeiß die Komponente weg und bastel dir ne neue. Bzw. nimm etwas anderes! Mehr fällt mir dazu nicht ein. Ich dachte im Laufe des Abends verstehe ich die Komponente noch. Aber auch alles was man korrigierend ändern müsste ist private deklariert und damit nicht änderbar. Und nötige Methoden, die zu ändern wären sind auch noch statisch.
Fazit: Ich verstehe es einfach nicht oder Borland hatte hier einen Praktikanten sitzen nach dem Motto: Wer braucht schon UDP.

richard_boderich 8. Jul 2008 09:18

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
@Sirius

Hättest du da eventuell eine Empfehlung für mich? Aber bitte nicht die Indys! Die Komponente sollte klein, einfach und
ohne viel Ballast sein. Selbst proggen würde ich nur im Notfall, falls sich nichts findet.

mfG Richard

pertzschc 8. Jul 2008 10:01

Re: Udpsocket onReceive Ereignis wird nicht ausgelöst?
 
Zitat:

Zitat von richard_boderich
Hättest du da eventuell eine Empfehlung für mich? Aber bitte nicht die Indys! Die Komponente sollte klein, einfach und
ohne viel Ballast sein.

Z.B. WSockets v.1.20 von Robert T. Palmqvist. Download und kurze Beschreibung hier. Von mir benutzt in mehreren Projekten unter D7.

Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.
Seite 1 von 2  1 2      

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