2017-04-25 38 views
2

如果一个C socket的recvmsg()有一个队列,我怎么知道有多少项目在队列中积压?在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

为什么你有'recv'的函数定义?通常情况下,'recv'是由OS定义的... –

+0

套接字确实有缓冲区。如果这就是你所指的,这可能是有趣的:http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux –

+0

我们,,数据是在你和同伴之间的空间和时间中展开。它在服务器,客户端和中间路由器中排队。它沿着海底光纤在地面站和卫星之间的自由空间中航行。有数据在那里,但你不知道它在哪里或多少。 – ThingyWotsit

回答

2

这不是一个队列,它是一个与大多数I/O设备相关的缓冲区,不仅是套接字。例如,当你从标准输入读取类似scanf的数据时,当你按下回车键时,数据会进入你的程序。你认为在哪里同时存储了所有按键?

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

2

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