我正在 Linux 上编写 C++ 应用程序。我的应用程序有一个 UDP 服务器,它在某些事件上向客户端发送数据。UDP 服务器还从客户端接收一些反馈/确认。
为了实现这个应用程序,我使用了一个 UDP 套接字(例如int fdSocket
)来发送和接收来自所有客户端的数据。我将这个 socked 绑定到端口 8080 并将套接字设置为 NON_BLOCKING 模式。
我创建了两个线程。在一个线程中,我等待某个事件发生,如果发生事件,那么我使用 fdsocket 将数据发送到所有客户端(在 for 循环中)。
在另一个线程中,我使用fdSocket
接收来自客户端的数据 ( recvfrom()
)。该线程计划每 4 秒运行一次(即每 4 秒调用一次recvfrom()
以从套接字缓冲区检索数据。由于它处于非阻塞模式,recvfrom()
如果没有可用的 UDP 数据,该函数将立即返回,然后我会去睡眠 4 秒)。
来自所有客户端的 UDP 反馈/确认有一个固定的有效负载,其大小为 20 字节。
现在我有两个与此实现相关的问题:
- 使用同一个套接字与多个客户端发送/接收 UDP 数据是否正确?
- 如何找到我的应用程序在没有 UDP 套接字缓冲区溢出的情况下可以处理的最大 UDP 反馈/确认数据包数(因为我每 4 秒读取一次,如果我在这 4 秒内收到很多数据包,我可能会丢失一些数据包,即,我需要找到我可以安全处理的数据包/秒的速率)?
我尝试fdsocket
使用函数调用获取我的套接字 ()的 Linux 套接字缓冲区大小getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
。从这个函数中,我发现我的套接字缓冲区大小为 110592。但我不清楚这个套接字缓冲区中将存储哪些数据:它是否只存储 UDP 有效负载或整个 UDP 数据包或事件整个以太网数据包?我参考了这个链接以获得一些想法,但感到困惑。
目前我的代码有点脏,我会尽快清理并在这里发布。
以下是我在发布此问题之前提到的链接。