|
From: Domibay - H. <hu...@do...> - 2021-10-22 18:19:11
|
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
> syn...@li...
> https://lists.sourceforge.net/lists/listinfo/synalist-public
|