sockets - 处理多个 UDP 客户端
问题描述
我的设置中有一个服务器和多个 UDP 客户端,每个客户端都以固定的时间间隔(几毫秒)发送一个布尔字符串(真/假,最大 5 字节)。基于此,我正在确定设备是否处于活动状态。在启动程序并使用 c++ 作为我的编程语言之前,客户端的数量是未知的。
UDP套接字连接中是否可以有多线程?我遇到了 TCP 的示例,他们创建了一个新的套接字描述符并产生了一个线程。如果可以为 UDP 服务编写多线程,请提供示例/参考代码。
期间
while (true)
{
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&cient_addr, &client_addr_len)) == -1)
{
perror("recvfrom");
exit(1);
}
// Process buffer...
// Do something with buffer
}
在多客户端场景中,如果我从一个客户端接收消息,则将其复制到最大缓冲区大小的本地缓冲区。在处理这条消息时,如果我们从另一个客户端收到一条消息,这条消息将在读取到本地缓冲区之前间歇性地存储在哪里?套接字文件描述符是否有自己的缓冲区?
如果两个客户端同时发送消息会发生什么?只有一个被读取到本地缓冲区,另一条消息会发生什么?它会等待下一个 recvfrom 吗?
我读到,如果最大缓冲区小于接收到的消息/数据包大小,那么 recvfrom 将只读取最大缓冲区长度,并且可能会出现一些错误......虽然我所有的客户端最多只发送 5 个字节......如果我分配最大字节到 1024 字节,这远远超出预期我要支付什么价格?
谢谢你。
解决方案
推荐阅读
- python - gRPC 基于角色的服务方法
- php - PHP 函数在单独的 php 页面上的每次调用中返回不同的数据
- javascript - 从 Windows 运行时组件触发 WebView 内的 javascript 事件
- file - 部分刷新后页面变为空白 - xpages
- scala - Scala 中的 Await.result 和 futures.onComplete 之间的区别
- c# - “JGitInternalException:未给出用户名”尝试通过 SSH 克隆时从 NGit 生成的形式 Git 存储库托管在本地 TFS 上
- java - Selenium - 点击标签(它会改变颜色片刻)然后标签恢复到未点击状态
- https - Paw.app -> 如何查看使用了哪些 TLS 设置?
- sql - 日期列作为主键一部分的优缺点
- visual-studio - Visual Studio 远程调试器 (MSMSMON.EXE) 似乎没有运行