如何清除掉socket发送缓存区中的数据

glacierful 2009-04-10 12:11:59
如果socket连接断了,但发了一串字符命令到发送缓存区中,如果连接恢复以后,再发下一条命令,会把上一次留在缓存区中的命令一起发出去。
看了一些以前的帖子,socket的缓存区是由内核来维护的无法清除。不知道有没有什么别的办法来做到这点。

因为我用select在连接中断后,检查socket句柄是否可写,返回结果是可以写的。这样就很难避免这种连接中断,但是依然可以send成功的情况。
如果没有办法来清空发送缓冲区,那是否有能及时检查到socket连接断开的方法?
...全文
4474 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
collinzhaoqi 2010-02-21
  • 打赏
  • 举报
回复
学习学习 我也遇到了这个问题
glacierful 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Conry 的回复:]
socket连接断了怎么会恢复呢?
根本就不存在要清空缓存区的问题
[/Quote]

我拔掉了网线,过一会儿再插上,连接会自动恢复。但在这个断的时间段内,send命令还是可以执行,所以缓存区中会有一些未发送字符。
等连接恢复后,再执行send的时候,原来的、现在的这些命令字符会全部发送出去。这样会导致收到很多命令的返回值。
所以希望能够像串口一样,清空缓存区中的原来的命令序列,只要最新的这条。
glacierful 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
对了,lpcbBytesReturned这个参数要给一个DWORD变量的地址,不要给nil。
[/Quote]
我传了lpcbBytesReturned,但WSAIoctl还是返回SOCKET_ERROR错误。
xghuzd 2009-04-12
  • 打赏
  • 举报
回复
学习了
jyh_baoding 2009-04-12
  • 打赏
  • 举报
回复
2楼的方法可以试一下,看看效果
Conry 2009-04-11
  • 打赏
  • 举报
回复
closesocket以后,所有相关资源都会释放
Conry 2009-04-11
  • 打赏
  • 举报
回复
socket连接断了怎么会恢复呢?
根本就不存在要清空缓存区的问题
醉生梦死 2009-04-10
  • 打赏
  • 举报
回复
顶!
zwtchy123 2009-04-10
  • 打赏
  • 举报
回复
uping
ylywyn136 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wenxy1 的回复:]
郁闷,刚才回复了,服务器出错。

有一个办法:用setsockopt设置socket 发送缓冲区大小为0, 然后再恢复socket 发送缓冲区为以前的值。

及时检查到socket连接断开的方法:用心跳包来检测。
[/Quote]
...目前还不懂..学习
Wenxy1 2009-04-10
  • 打赏
  • 举报
回复
郁闷,刚才回复了,服务器出错。

有一个办法:用setsockopt设置socket 发送缓冲区大小为0, 然后再恢复socket 发送缓冲区为以前的值。

及时检查到socket连接断开的方法:用心跳包来检测。
cnzdgs 2009-04-10
  • 打赏
  • 举报
回复
试试WSAIoctl函数,控制码给SIO_FLUSH。
cnzdgs 2009-04-10
  • 打赏
  • 举报
回复
对了,lpcbBytesReturned这个参数要给一个DWORD变量的地址,不要给nil。
cnzdgs 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 glacierful 的回复:]
用WSAIoctl加SIO_FLUSH试了一下,没有清掉。
是这么写的:WSAIoctl(m_socket, SIO_FLUSH, nil,0,nil,0,nil,nil,nil);
[/Quote]
是这样调用没错,如果没有清掉就说明这种方法不能达到你的目的。
glacierful 2009-04-10
  • 打赏
  • 举报
回复
用WSAIoctl加SIO_FLUSH试了一下,没有清掉。
是这么写的:WSAIoctl(m_socket, SIO_FLUSH, nil,0,nil,0,nil,nil,nil);
glacierful 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bragi523 的回复:]
2楼的方法值得一试
对于检测网络中断
如果中断后只要求断开
设置一下keepalive属性就好了
[/Quote]

这个属性既可以设置也可以取值,网络是否中断是否可以通过取这个属性的值来得到?
glacierful 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
试试WSAIoctl函数,控制码给SIO_FLUSH。
[/Quote]
查了一下MSDN,发现WSAIoctl函数的参数很多,其中的输入输出缓存区参数是发我自己的缓存区吗?还是在SIO_FLUSH的情况下,这些值可以赋为空值。
bragi523 2009-04-10
  • 打赏
  • 举报
回复
2楼的方法值得一试
对于检测网络中断
如果中断后只要求断开
设置一下keepalive属性就好了

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧