网络编程--客户机断开连接(WinSock)

近公司的事情比较忙,没多少时间来总结自己所学的东西,辜负了曾关注鄙人博客的热心朋友,在此致歉!

这次主要要写一个我最近碰到的网络编程方面的问题,问题虽小,但花了我很长的时间,今天刚刚解决,趁着对这个问题还有感觉的时候,先写出来,至于原理和比较深层的问题,我也是不是很懂,只说我的解决之道,和大家共同讨论,若有幸能遇高人指点,自身喜不自禁。由于不曾怎么写过东西,我想了下,就先写出问题,在写出我的解决方法,再去讨论其中的道理。


问题:客户机连接服务器,没问题,发送、接收数据正常,断开客户机,重新连接,则无法再次连接

解决方法:这是个TCP/IP面向连接的一种确保数据发送接收双方能无错传输机制的结果。具体到编程问题,就是在你调用closesocket()函数后,TCP/IP机制相关的TIME_WAIT的问题。由于这个关系到TCP/IP 的底层实现,我也不是很懂,解决的思路是就设置客户机创建的SOCKET的选项,使之调用closesocket()后没有延时等待。允许再次连接,这个问题就解决了。


具体方法:客户机如果使用bind()函数,则要注意在使用setsockopt()时要注意其返回值,具体见MSDN:If the setsockopt function is called before the bind function, TCP/IP options will not be checked with TCP/IP until the bind occurs. In this case, the setsockopt function call will always succeed, but the bind function call may fail because of an early setsockopt failing.

为了避免这个问题,最好直接将setsockopt()函数放在bind()函数之后。

然后,给setsockopt()的optname参数赋值SO_LINGER。 在定义linger结构体对象,并将onoff参数赋非零值,将另一个参数赋0。这个0是个超时值。

最后,调用setsockopt()函数,问题解决!


实例代码片段:

//bind or create socket

……

int iLevel = SOL_SOCKET; int iOptname = SO_LINGER; int iOptlen = sizeof(linger); linger csOptval; csOptval.l_onoff = 1; csOptval.l_linger = 0;

if( SOCKET_ERROR == setsockopt( m_s, iLevel, iOptname, (char*)&csOptval, iOptlen ) ) {

//错误处理!

}

//connect to server


至于具体原理,恕我才疏学浅,不能解答,恳请高人不吝赐教!

能得到上述解决方法,全依赖于“紫月城游戏软件“的博文--tcp要点学习-断开连接。这次,再次谢谢他。

地址:http://www.cppblog.com/kevinlynx/archive/2008/05/14/49825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值