0

我知道我的 C 方式,但我在 Pascal 中有一个使用 synapse 库的 UDP 客户端和服务器的现有代码。我的问题是:
客户:
- 它是连接()广播(而不是 sendto())的好方法吗?

服务器:
- 怎么可能调用 bind() 两次?(主要问题)
- 你为什么要绑定()到发件人IP?

问候

编辑:
澄清如何使用此代码:
有多个客户端尝试将数据包发送到服务器。在任何客户端的第一个数据包到达服务器后,服务器将从此只接受来自第一个客户端的数据。客户端和服务器在不同的机器上运行。

客户:

UDPport:=TUDPblockSocket.Create;
UDPport.EnableBroadcast(true);
UDPport.Connect(cBroadcast,'1234');
while (not EOF(DATAfile)) do begin
  read(DATAfile,DATApacket);
  with (DATApacket) do begin
    NCOMport.SendBuffer(Addr(DATApacket),SizeOf(DATApacket));
  end;
end;

服务器:

begin
  with TUDPblockSocket.Create do begin
    Bind(cAnyHost,'1234');
    AnyHost:=true;
    while (true) do begin
      if (WaitingData>0) then begin
        repeat
          buffer:=RecvPacket(c_UDPtimeout);
        until (WaitingData<=0);
        if (AnyHost) then begin
          SenderIP:=GetRemoteSinIP;
          Bind(SenderIP,'1234');
          AnyHost:=false;
        end else begin
          {extracting information out of the received data buffer}
        end;
      end;
    end;
    Free;
  end;
end;

和:

const  c_UDPtimeout  = 100;

问候

4

1 回答 1

2
  • 它是连接()广播(而不是sendto())的好方法吗?

你可以。对 UDP 套接字真正做的只是将指定的 IP 静态设置为传出数据包的目的地,因此您可以send()使用sendto().

  • 怎么可能调用 bind() 两次?(主要问题)

您不能bind()多次使用套接字。如果你需要重新绑定一个套接字,你必须先关闭它。您的代码示例基本上是将套接字绑定到所有本地 IP 上的同一端口,然后尝试将其重新绑定到仅在您的端口上接收任何数据的第一个 IP。

  • 你为什么要绑定()到发件人IP?

您不会也不能bind()访问远程 IP。

于 2013-01-10T01:48:22.727 回答