我正在 Linux 上编写 C++ 应用程序。我的应用程序有一个 UDP 服务器,它在某些事件上向客户端发送数据。 UDP 服务器还接收来自客户端的一些反馈/确认。
为了实现这个应用程序,我使用了一个 UDP 套接字(例如int fdSocket
)从所有客户端发送和接收数据。我将其绑定到端口 8080 并将套接字设置为 NON_BLOCKING 模式。
我创建了两个线程。在一个线程中,我等待某个事件发生,如果发生事件,那么我使用 fdsocket 将数据发送到所有客户端(在 for 循环中)。
在另一个线程中我使用fdSocket
从客户端接收数据(recvfrom()
)。该线程计划每 4 秒运行一次(即每 4 秒它将调用recvfrom()
从套接字缓冲区检索数据。由于它处于非阻塞模式recvfrom()
如果没有可用的 UDP 数据,函数将立即返回,然后我将休眠 4 秒)。
来自所有客户端的UDP反馈/确认具有固定的有效负载,其大小为20字节。
现在我有两个与此实施相关的问题:
- 使用相同的套接字发送/接收 UDP 数据是否正确
与多个客户?
- 如何找到我的应用程序可以在没有 UDP 套接字缓冲区溢出的情况下处理的 UDP 反馈/确认数据包的最大数量(因为我每 4 秒读取一次,如果我
在这 4 秒内收到大量数据包,我可能会丢失一些数据包,即,我需要找到我可以安全处理的数据包/秒速率)?
我试图获取我的套接字的 Linux 套接字缓冲区大小(fdsocket
) 使用函数调用getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
。从这个函数中我发现我的套接字缓冲区大小是110592。但是我不清楚这个套接字缓冲区中将存储什么数据:它会只存储UDP有效负载或整个UDP数据包还是整个以太网数据包?我提到了这个link http://www.6test.edu.cn/~lujx/linux_networking/index.html?page=0131777203_ch04lev1sec1.html得到一些想法但感到困惑。
目前我的代码有点脏,我会清理并很快将其发布到这里。
以下是我在发布此问题之前引用的链接。
-
Linux网络 http://www.6test.edu.cn/~lujx/linux_networking/index.html?page=0131777203_ch04lev1sec1.html
- UDP SendTo 和 Recvfrom 最大缓冲区大小 https://stackoverflow.com/questions/3292281/udp-sendto-and-recvfrom-max-buffer-size
- UDP套接字缓冲区溢出检测 https://stackoverflow.com/questions/8027758/udp-socket-buffer-overflow-detection
- UDP广播和单播通过同一个套接字? https://stackoverflow.com/questions/800302/udp-broadcast-and-unicast-through-the-same-socket?rq=1
- 在多个线程中从同一个 UDP 套接字发送 https://stackoverflow.com/questions/3460645/sending-from-the-same-udp-socket-in-multiple-threads?rq=1
- 如何在 C 中刷新 UDP 套接字的输入缓冲区? https://stackoverflow.com/questions/2299894/how-to-flush-input-buffer-of-an-udp-socket-in-c?rq=1
- 如何查看linux的socket缓冲区大小 https://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux?rq=1
- 如何获取 UDP 套接字的排队数据量? https://stackoverflow.com/questions/9278189/how-do-i-get-amount-of-queued-data-for-udp-socket?rq=1
以四秒的固定间隔读取套接字肯定会导致数据包丢失。传统的、经过验证的非阻塞 I/O 方法是解复用器系统调用select(2) http://www.kernel.org/doc/man-pages/online/pages/man2/select.2.html/poll(2) http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html/epoll(7) http://www.kernel.org/doc/man-pages/online/pages/man4/epoll.4.html。看看您是否可以使用它们来捕获/对其他事件做出反应。
另一方面,由于您已经在使用线程,因此您可以只进行阻塞recv(2) http://www.kernel.org/doc/man-pages/online/pages/man2/recv.2.html没有那四秒钟的睡眠。
Read 用于解释SO_RCVBUF
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)