首页 > 解决方案 > 如何从 Indy udp 服务器获取响应字符串?

问题描述

我正在尝试在 C++ Builder 10.3.1 中的 Indy UDP 客户端和服务器之间创建一个简单的文本交换。这是我使用的代码:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    IdUDPClient1->Send("Hello");
    UnicodeString resp = IdUDPClient1->ReceiveString();
    ShowMessage(resp);
}

void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread,
    const TIdBytes AData, TIdSocketHandle *ABinding)
{
    UnicodeString req = BytesToString(AData);

    if(req == "Hello"){
        // why this don't work?
        ABinding->Send("Hello 2");

        // the following works if ThreadedEvent = true
        // AThread->Server->Send(ABinding->PeerIP, ABinding->PeerPort, "Hello 2");
    }
}

我无法从客户端的服务器获得响应。我究竟做错了什么?

标签: udpc++builderindy

解决方案


在服务器端,事件中提供TIdSocketHandleOnUDPRead对象没有“连接”(从操作系统的角度来看)到发送接收数据的对等方,因此默认调用ABinding->Send() 需要指定要发送到的目标 IP/端口。这就是为什么ABinding->Send(ABinding->PeerIP, ABinding->PeerPort, "Hello 2");有效而ABinding->Send("Hello 2");无效的原因。

调用ABinding->Send()不以任何方式依赖于服务器的ThreadedEvent属性。该属性仅控制是否在主 UI 线程的上下文中触发服务器事件。它对服务器如何分配和管理其套接字没有影响。OnUDPRead

但是,如果服务器的ThreadedEvent属性为 false,并且客户端和服务器在同一个应用程序进程中运行,则服务器将无法在您运行时触发其OnUDPRead事件。Button1Click()在这种情况下,您需要设置ThreadedEvent为 true,以便在OnUDPRead工作线程的上下文中触发事件,而不是在主 UI 线程上等待。

否则,将客户端移动到它自己的工作线程。


推荐阅读