当前位置: 首页 > 图文教程 > 认证考试 > 计算机等级考试 > 教你解决客户机连接服务器无法再次连接的问题

计算机等级考试
excel电子表格计算日期差工龄生日等
2009全国计算机等级考试新变化
计算机二级DELPHI技巧:DELPHI获取U盘盘符代码
计算机二级:DELPHI中指针和类TLIST结合
计算机二级:DELPHI中使用Tlist类的学习
计算机二级DELPHI技巧:DELPHI程序错误类型
计算机三级网络技术:网站被黑的10大原因
计算机二级DELPHI设置DBGridEh自动排序方法
计算机等级考试辅导:禁止MessageBox()弹出的对话框
计算机等级考试:Windows7Shell命令大汇总
把表空间从字典托管模式升级成本地托管模式
去掉系统快捷方式箭头的途径:修改注册表
计算机一级辅导:电脑连续死机是什么问题
C++编程:如何安全终止线程
做一个合格的软驱磁头清洁工
电脑光驱读盘差怎么办?
教你还原不小心被删除的文件资料
DELPHI辅导:打开与编辑数据表
delphi数据库引擎管理器
计算机二级C++辅导:回调函数用法

计算机等级考试 中的 教你解决客户机连接服务器无法再次连接的问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-04   浏览: 210 ::
收藏到网摘: n/a

  问题:客户机连接服务器,没问题,发送、接收数据正常,断开客户机,重新连接,则无法再次连接
  解决方法:这是个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