我有一个程序可以在视觉工作室的 udp 中接收消息。
有时我会错过一条消息。如果 udp rec 缓冲区已满,我想使用 select 查看 udp 缓冲区使用的大小。
我如何使用 select 来达到这个目的?
我在哪里可以看到一个例子?
事后发现您的接收缓冲区已满对您没有任何好处 - 数据包已经被丢弃。甚至更多 - 您需要在connect()
或之前设置缓冲区大小bind()
,之后它们不会改变。
您应该做的是将套接字接收缓冲区预设为可以适应您的流量峰值的较大值,并尝试更快地处理您的网络输入。这通常意味着在select()
非阻塞套接字上执行(甚至更好——一些高级 API,如epoll(7)
边缘触发模式下的 Linux),并排空套接字输入,直到获得EWOULDBLOCK
.
您无法通过使用select()
或任何其他套接字 API 发现您错过了 UDP 数据包。这必须在应用层协议中完成,即传输层的上一层。通常的做法是在应用程序消息头中包含序列号。
您可以使用getsockopt
获取套接字选项,包括接收缓冲区大小。用于setsockopt
设置大小。
获取大小的示例:
int size;
getsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &size);
std::cout << "Buffer size is currently " << size << " bytes\n";
我认为 UDP(相对于 TCP)的主要属性之一是您有时会丢失消息。你必须设计你的协议来解决这个问题。我不是 UDP 方面的专家,但我不明白看到缓冲区的大小会对你有什么帮助,我不明白你为什么要使用select
它。