如果C套接字的recvmsg()有一个队列,我怎样才能找出队列中积压了多少项?
我的问题是,从recvmsg()收到内容后代码的速度有时慢于发送到recvmsg()的数据速率,这会在逻辑上导致队列?如果队列变得太大会怎么样?
例如,如果这是我的recv()代码:
while (recvmsg(SocketA,...) > 0)
{
...
...something that takes 1.5 seconds to execute/complete...
...
}
如果其他地方的以下函数每1秒调用一次:
// gets called every 1 second
int send_to_sock()
{
...
send(SocketA, ...);
...
}
我检查了recvmsg()的参考页面,但没有提到有关队列的任何内容,但似乎有一个队列,因为我正在观察递增累加的延迟。但是如果队列太长,代码就会停止工作,所以我想知道是否有办法检查队列长度。
答案 0 :(得分:2)
它不是一个队列,它是与大多数I / O设备相关的缓冲区,而不仅仅是套接字。例如,当您使用scanf之类的东西读取标准输入时,按Enter键时数据会进入您的程序。您认为在此期间所有击键都存储在哪里?
这些缓冲区的具体细节是实现定义的,但通常套接字会发生的情况是,如果缓冲区已满,则会丢弃新的数据包。您可以在How to find the socket buffer size of linux和How can I tell if a socket buffer is full?中找到有关查询缓冲区状态的详细信息。
答案 1 :(得分:2)
是。有一个套接字接收缓冲区。可以使用SO_RCVBUF选项通过getsockopt()
和setsockopt()
获取和设置其最大大小。当它填满时,在TCP的情况下,发送者被告知停止发送;在UDP的情况下,将丢弃进一步的传入数据。