首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么获取SOCKET缓冲区是否有未发送到网络上的数据

2013-12-30 
如何获取SOCKET缓冲区是否有未发送到网络上的数据?本帖最后由 Q342210738 于 2013-12-22 18:49:51 编辑问

如何获取SOCKET缓冲区是否有未发送到网络上的数据?
本帖最后由 Q342210738 于 2013-12-22 18:49:51 编辑 问题:在SOCKET编程中,可以使用setsockopt(s, SOL_SOCKET, SO_SNDBUF, buf_len, pam_len)函数设置SOCKET发送数据的缓冲区大小,使用中,我将缓冲区的设的较大,有6M多,在调用send接口发送数据之前,我想查询现在这个socket缓冲区中是否还有未发送到网络上的数据怎么才可以查询到缓冲区是否有剩余的数据还未发送到网络上?
[解决办法]
楼主想达到什么目的?
[解决办法]

引用:
Quote: 引用:

楼主想达到什么目的?

就是想在调用send接口发送数据之前,查询到socket缓冲区中是否还有未发送到网络上的数据

应该是没有现成的方法了,所以才需要循环发送
[解决办法]
循环发送,获取sendedsize自己记录。
[解决办法]
send接口还是很成熟的。

如果是UDP的话,可以用自定义协议(对方发回接收到得数据数量,来判断是否丢包或者发送失败之类的)
如果是TCP的话,因为本身保证传输的,根本没必要如此。
[解决办法]
引用:
Quote: 引用:

楼主想达到什么目的?

就是想在调用send接口发送数据之前,查询到socket缓冲区中是否还有未发送到网络上的数据

这个问题可能要到socket的底层协议栈了,不是很了解。但是如果你的发送缓冲区满的话(对方没有及时收),会降低发送的效率 send可能返回值为0,异步循环发送会导致循环的次数过多,你可以用select等一段时间,降低CPU空转。
不知道是不是为了解决这个问题
[解决办法]
这个不用你关心
你想发就发
底层会处理发送队列的
[解决办法]
TCP发送的数据,要求对方确认,如果在发送主机设定的时间内,没有收到确认应答,将进行重传。只有收到确认后,TCP才会把已经确认的数据从队列缓冲区中删除。

我觉得应用层能做的好像就是循环发送,通过send返回值记录the total number of bytes sent。
[解决办法]
就算内核发送出去了, 也无法保证网卡缓冲, 还有如果丢包协议里面可能需要再次发送
如果需要知道是否到达通讯的另一端, 最好socket的另一端做回应, 告知收到数据

[解决办法]
引用:
Quote: 引用:

这个不用你关心
你想发就发
底层会处理发送队列的


知道底层会处理的,就是想从应用程序中知道内核层的数据有没有发送完
应该是没有
也没有什么意义吧
[解决办法]
好像没有查询的必要。
只有没收到的数据,没有没发送的数据

热点排行