在C中,对于套接字,recvmsg()是否有队列?

时间:2017-04-25 22:18:01

标签: c sockets recv

如果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()的参考页面,但没有提到有关队列的任何内容,但似乎有一个队列,因为我正在观察递增累加的延迟。但是如果队列太长,代码就会停止工作,所以我想知道是否有办法检查队列长度。

2 个答案:

答案 0 :(得分:2)

它不是一个队列,它是与大多数I / O设备相关的缓冲区,而不仅仅是套接字。例如,当您使用scanf之类的东西读取标准输入时,按Enter键时数据会进入您的程序。您认为在此期间所有击键都存储在哪里?

这些缓冲区的具体细节是实现定义的,但通常套接字会发生的情况是,如果缓冲区已满,则会丢弃新的数据包。您可以在How to find the socket buffer size of linuxHow can I tell if a socket buffer is full?中找到有关查询缓冲区状态的详细信息。

答案 1 :(得分:2)

是。有一个套接字接收缓冲区。可以使用SO_RCVBUF选项通过getsockopt()setsockopt()获取和设置其最大大小。当它填满时,在TCP的情况下,发送者被告知停止发送;在UDP的情况下,将丢弃进一步的传入数据。