TCP发送队列深度

时间:2020-03-06 14:27:53  来源:igfitidea点击:

我如何发现已将多少字节发送到TCP套接字但尚未放入网络中?

在这里查看该图:
<IMG SRC =" http://www.tcpipguide.com/free/diagrams/tcpswpointers.png">

我想知道类别2、3和4的总数或者3和4的总数。这是在C(++)中以及在Windows和Linux上。理想情况下,我可以使用一个ioctl,但似乎没有。

解决方案

某些Unix风格可能有API方式来做到这一点,但是没有办法可以移植到不同的变体中。

在Linux下,请参见tcp(7)的手册页。

看来我们可以通过ioctl(sock,SIOCINQ ...

通过TCP_INFO getsockopt()调用返回的结构成员可能还可以获得其他统计信息。

如果我们想确定是否要添加数据:请放心,发送将一直阻塞,直到数据在队列中为止。如果我们不想阻止它,可以告诉它发送(2):

send(socket, buf, buflen, MSG_DONTWAIT);

但这仅适用于Linux。

我们还可以将套接字设置为非阻塞:

fcntl(socket, F_SETFD, O_NONBLOCK);

如果无法将数据写入流,则这种写操作将返回错误(EAGAIN)。