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