簡體   English   中英

pascal / delphi中的udp客戶端服務器使用synapse庫調用bind兩次(blcksock)

[英]udp client server in pascal / delphi calling bind twice using synapse library (blcksock)

我知道我在C周圍的方式,但我使用synapse庫在Pascal中使用UDP客戶端和服務器的現有代碼。 我的問題是:
客戶:
- 這是連接()到廣播(而不是sendto())的好方法嗎?

服務器:
- 怎么可能兩次調用bind()? (主要問題)
- 為什么你綁定()到senderIP?

問候

編輯:
為了闡明如何使用此代碼:
有多個客戶端嘗試將數據包發送到服務器。 在任何客戶端的第一個數據包到達服務器之后,服務器將從那時起僅接受來自該第一個客戶端的數據。 客戶端和服務器在不同的計算機上運行。

客戶:

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;

問候

  • 是連接()到廣播(而不是sendto())的好方法嗎?

你可以。 對UDP套接字真正做的就是靜態地將指定的IP設置為傳出數據包的目標,這樣您就可以使用send()而不是sendto()

  • 怎么可能兩次調用bind()? (主要問題)

你不能多次bind()一個套接字。 如果需要重新綁定套接字,則必須先將其關閉。 您的代碼示例基本上將套接字綁定到所有本地IP上的同一端口,然后嘗試將其重新綁定到接收端口上任何數據的第一個IP。

  • 你為什么要綁定()到senderIP?

您不會也不能將bind()到遠程IP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM