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