udp - 如何从 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");
}
}
我无法从客户端的服务器获得响应。我究竟做错了什么?
解决方案
在服务器端,事件中提供TIdSocketHandle
的OnUDPRead
对象没有“连接”(从操作系统的角度来看)到发送接收数据的对等方,因此默认调用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 线程上等待。
否则,将客户端移动到它自己的工作线程。
推荐阅读
- vb.net - 可以在函数中更改公共变量,还是这是不好的做法?
- firebase - Flutter Firebase 延迟功能
- asp.net - 如何在 ASP.NET Core 5.0 中忽略对 favicon.ico 的请求?
- python - 调用属性装饰器的类比?
- c# - 如何防止一个类多次具有相同类型的属性?
- javascript - Discord.js:如何确保机器人不会从列表中选择两个相同的单词
- swift - SplitViewController 在启动时总是显示 DetailViewController
- python - 我们如何编码时间戳并将 DBSCAN 集群的集群保存为 json 和 csv?
- visual-studio - 如何构建应用来调用 Power BI 刷新历史记录?
- azure - 将私有 Azure Docker Registry 的 Pull-Only 权限授予第三方的最安全方法