gpt4 book ai didi

delphi - 处理TUdpSocket

转载 作者:行者123 更新时间:2023-12-03 15:34:21 26 4
gpt4 key购买 nike

我正在尝试在 Delphi 中使用 TUdpSocket。我想做的是连接到 UDP 服务器,发送一些数据并等待答复。数据发送正确,但控件未收到任何内容。我不知道为什么。我已经在这个问题上挣扎了好几个小时了,我要放弃了:-(。

我尝试使用TIdUDPClient,但情况是一样的。数据发送正常,但未收到数据。

只有 TIdUDPServer 才能或多或少地正常工作,因为它既发送又接收数据。不幸的是,数据接收是由单独的线程(主线程或其他线程,取决于 ThreadedEvent 属性)处理,这迫使我使用同步并使整个代码变得复杂。我想在我自己的线程中处理 UDP 连接。只需发送一些数据并调用 WaitForData() 等待答案,然后在同一线程中处理它。

如果可能,我不想使用任何第三方控件,但如果这是唯一的解决方案,我接受它。

非常非常感谢您提前提供的帮助。

---- 示例 ---

i) TUDPSocket:

var
lR, lW, lE: boolean;
begin
UdpSocket1.LocalPort := '1600';

UdpSocket1.RemotePort := '1600';
UdpSocket1.RemoteHost := '127.0.0.1';
UdpSocket1.Connect;

UdpSocket1.Sendln('test');

UdpSocket1.Select(@lR, @lW, @lE, 2000);
if lR then
ShowMessage(UdpSocket1.Receiveln());
end;

正如您所看到的,控件应该接收它传输的数据。显然确实如此,因为在调用 Select() 方法后 lR 的计算结果为 true。但 Receiveln() 返回一个空字符串,就像 ReceiveBuf() 一样。当我启动 UDP 服务器并向其发送一些数据时,它被正确接收,因此我确定数据确实已发送。

最佳答案

您应该只需要这个:

function SayHi(Host: String; Port: Integer): String;
var
Client: TIdUDPClient;
begin
Client := TIdUDPClient.Create(nil);
try
Client.Host := Host;
Client.Port := Port;
Client.Send('Hello');
Result := Client.ReceiveString(1000);
finally
Client.Free;
end;
end;

它将在同一线程中发送 UDP 数据包并接收 UDP 数据包或在超时后引发异常。

如果上述方法不起作用,请检查(使用类似 Wireshark 的内容)客户端是否实际发送了数据。然后检查服务器是否实际接收了数据包。

Send() 最终(在 Windows 上)调用 WinSock 的 sendto(),而 ReceiveString() 使用 select()recvfrom()。您可以通过以下方式模拟 TIdUDPServer:

while not Terminated do begin
S := Client.ReceiveString(1000);
DoSomething(S);
end;

关于delphi - 处理TUdpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3931484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com