Hello,
On an UDP data flow the receiving end uses the "Bind()" method
and the sending end uses the "Connect()" method.
The life time of a socket starts with the
"TUDPBlockSocket.CreateSocket()" call and
ends with the "TUDPBlockSocket.CloseSocket()" call.
During the life time of the socket the sending part can use different
"Connect()" calls to send messages to different targets.
But on the receiving end the "Bind()" method can be used only once.
In this use case "UDP_trx.udpsock" is the receiving end.
The sending end you find with "GetRemoteSinIP()" and
"GetRemoteSinPort()" method calls that will turn you a different port
than that "UDP_trx.udpsock" has bound to. That is where the potential
response would go to.
The receiving end must listen for data with the "RecvPacket()" call
while the "WaitingData()" call will tell whether data arrived while the
the receiving end was not listening. Certainly it will be "0" at the
beginning because the socket did not exist yet. Received data can only
stack up when the socket on the receiving end was already bound
successfully.
I hope that helps a bit.
Best Regards,
Hugo
El 22/10/21 a las 11:05, S.C.T.N GmbH escribió:
Hello
I need help to understand the basic concept of UDP sockets:
I am trying to set up a point-to-point connection between host
A(192.168.2.222:4000) and host B(192.168.2.224:4000)
I am opening the socket like this:
------------------------------------------------------------------
function UDP_trx.s_open(IP,PORT:string):boolean;
begin
udpsock:=TUDPBlockSocket.Create;
udpsock.Bind('0.0.0.0',PORT); // bind socket to local NIC ?
udpsock.Connect(IP,PORT); // connect socket to remote IP:PORT ?
end;
-----------------------------------------------------------------
I am sending one byte over the socket (do I need to connect for every
SendByte?)
-----------------------------------------------------------------
procedure UDP_trx.s_tx(txbyte:byte; IP,PORT:string);
var i:integer; s:string;
begin
//udpsock.Connect(IP,PORT); // do I need to reconnect every time?
udpsock.SendByte(txbyte);
end;
-----------------------------------------------------------------
And I am receiving one byte over the socket like this:
-----------------------------------------------------------------
function UDP_trx.s_rx(var rxbyte:byte; IP,UDPPRT:string):boolean;
var ipstr:string; prt:integer;
begin
if udpsock.WaitingDataEx=0 then begin result:=false; exit; end;
rxbyte:=udpsock.RecvByte(1);
//ipstr:=udpsock.GetRemoteSinIP;
//prt:=udpsock.GetRemoteSinPort;
//if (ipstr=IP) and (prt=StrToInt(UDPPRT)) then begin
result:=true; exit; end; //filter for RemoteSin
result:=true;
end;
-----------------------------------------------------------------
What I do not understand is this:
Whenever I send a byte to any IP adress (even one that does not exist)
I am receiving a byte at the remote end as long as the port is matching.
Only when I use the s_rx filter with GetRemoteSinIP and
GetRemoteSinPort I can be sure that I receive from the correct source IP.
So I suppose that I have not really understood how to use BIND and
CONNECT
Thank you for help
Mit freundlichem Gruß / Yours sincerely / Cordialement
Christian Sporer
Grüntenstr.18
80686 München
Tel.: +(49) 89 54217952
Fax.: +(49) 89 52389119
_______________________________________________
synalist-public mailing list
synalist-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synalist-public
_______________________________________________
synalist-public mailing list
synalist-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synalist-public