教你解决客户机连接服务器无法再次连接的问题
2009-07-02 00:00:00 来源:WEB开发网问题:客户机连接服务器,没问题,发送、接收数据正常,断开客户机,重新连接,则无法再次连接
解决方法:这是个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
- ››解决flash 中无法导出swf文件的方法
- ››解决"ios模拟器未能安装此应用程序"办法...
- ››解决jquery easyui easyloader加载外部js文件失败...
- ››解决无法使用Android SDK Manager下载SDK开发包的...
- ››解决网页内容无法复制
- ››解决Android手机在开发调试时logcat不显示输出信息...
- ››解决Windows 8操作系统假死的方法
- ››解决ubuntu 不识别 android 设备 方法
- ››解决ubuntu server sudo出现sudo:must be setuid ...
- ››解决数据库 Table 'content_tags' is mar...
- ››解决FF浏览器和IE下载文件乱码问题
- ››解决Firefox/Opera 不支持 onselectstart事件
更多精彩
赞助商链接