Linux套接字,如何获取发送缓冲区中的字节数/数据包数量?

5
我正在Linux下开发一个简单的网络应用程序,需要读取以下两个属性:
  1. 接收缓冲区中已准备好读取的字节数。
  2. 套接字发送缓冲区中尚未发送的字节数。
使用ioctl()函数的FIONREAD选项可以获取接收缓冲区(第一个属性)中的数据。但对于第二个属性(发送缓冲区中的字节数),我不确定该如何读取。我尝试了getsockopt()函数中的SO_SNDBUF选项,但它返回的是发送缓冲区的最大大小,而不是当前发送缓冲区中的数据大小。
有什么想法或建议吗?

你为什么需要这个? - user207421
@EJP 我有几个套接字打开,并且我想选择具有最多空闲缓冲区的那一个。 - hanvari
你知道这永远不可能是原子操作,对吧? - Chaitanya Lala
叹气。你为什么要选择具有最多空闲缓冲区的那个? - user207421
1个回答

8
这里是如何获取:
  1. The length of data in Receive Buffer which is not read yet:

    ioctl( socket_descriptor, FIONREAD, &size );  // alternative 1
    ioctl( socket_descriptor, SIOCINQ, &size );   // alternative 2
    
  2. The length of data in Send Buffer which is not drained yet (either not sent yet or send but not acknowledged by receiver):

    ioctl( socket_descriptor, TIOCOUTQ, &size );  // alternative 1
    ioctl( socket_descriptor, SIOCOUTQ, &size );  // alternative 2
    

Reference: http://linux.die.net/man/7/tcp


有没有想过在Windows上有没有功能等效的替代方案(如果可能的话)? - Pavel P
在终端中有没有任何Linux命令可以做到这一点? - Liu Guangxuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接