0

私は C の使い方を知っていますが、シナプス ライブラリを使用して Pascal で UDP クライアントとサーバー用の既存のコードを持っています。私の質問は次の
とおり
です。

サーバー:
- どうすれば bind() を 2 回呼び出すことができますか? (主な質問)
- なぜ send() を sendIP にバインドするのですか?

よろしく

編集:
このコードの使用方法を明確にするために:
データパケットをサーバーに送信しようとするクライアントが複数あります。いずれかのクライアントの最初のパケットがサーバーに到着すると、サーバーはそれ以降、この最初のクライアントからのデータのみを受け入れます。クライアントとサーバーは異なるマシンで実行されます。

クライアント:

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()の代わりに)connect()をブロードキャストするのは良い方法ですか?

あなたは出来る。UDP ソケットに対して実際に行うことは、指定された IP を発信パケットの宛先として静的に設定することだけsend()ですsendto()

  • bind() を 2 回呼び出すにはどうすればよいですか? (主な質問)

bind()ソケットを複数回使用することはできません。ソケットを再バインドする必要がある場合は、まずソケットを閉じる必要があります。あなたのコード例は基本的に、ソケットをすべてのローカル IP の同じポートにバインドしてから、ポートでデータを受信する最初の IP だけに再バインドしようとしています。

  • なぜ send() を sendIP にバインドするのですか?

bind()リモート IP にはできませんし、できません。

于 2013-01-10T01:48:22.727 に答える