网络编程:客户机断开连接(WinSock)计算机等级考试

文章作者 100test 发表时间 2010:01:01 12:57:00
来源 100Test.Com百考试题网


  编辑特别推荐:

  送给正在学习C 朋友的50条建议

  C 笔试考前练习

  这次主要要写一个我最近碰到的网络编程方面的问题,问题虽小,但花了我很长的时间,今天刚刚解决,趁着对这个问题还有感觉的时候,先写出来,至于原理和比较深层的问题,我也是不是很懂,只说我的解决之道,和大家共同讨论,若有幸能遇高人指点,自身喜不自禁。由于不曾怎么写过东西,我想了下,就先写出问题,在写出我的解决方法,再去讨论其中的道理。
  问题:客户机连接服务器,没问题,发送、接收数据正常,断开客户机,重新连接,则无法再次连接
  解决方法:这是个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*)


相关文章


控制台聊天程序实例 代码计算机等级考试
数值转换为Excel列标的算法计算机等级考试
C 托管程序转换为C#程序ILASM_ILDASM应用计算机等级考试
VC 6.0下搭建wxWidgets开发环境计算机等级考试
网络编程:客户机断开连接(WinSock)计算机等级考试
标准库名字和头文件_算法简介_再谈IO库计算机等级考试
全国计算机等级考试二级C 语言程序设计标准预测试卷汇总计算机等级考试
计算机二级C 基础:CArray详解计算机等级考试
C 基础:C 的名字查找计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛