[英]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.