蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

socket问题!

一台服务器linux运行一套TCP 服务程序,另一台windows机器运行它的一个客户端,当客户端程序正常连接上来后在linux用netstat看有一个连接成功的连接上来,但当关闭客户端后,在linux上用netstat看该连接还在,而在windows机器上用netstat看,该连接已经不存在了,各位有知道这是什么问题吗?

Re: socket问题!

正常!

TCP 链接断开后 端口要过一会才能释放
see UNP

Re: socket问题!

呵呵,关键是都等了几天都不见掉下来,不知道这是为啥?

Re: socket问题!

请问 linux 端 netstat 后,此连接处于什么状态 , ESTABLISHED ?
能将netstat 的结果贴出来吗?

Re: socket问题!

我觉得是你服务器端程序处理的问题吧

Re: socket问题!

抛开程序编码的问题,就SOCKET来说,客户端都已经退出的话,该TCP连接不应该持续存在的。

Re: socket问题!

>抛开程序编码的问题,就SOCKET来说,客户端都已经退出的话,该TCP连接不应该持续存在的

您这个说法不完全正确,如果双方连接已经建立,并在未来的一段时间内无任何通信,此时客户端主动断开连接,但由于各种网络问题,服务器就是收不到fin, 服务器一直保持ESTABLISHED状态, 而客户端连发几个fin 后,收不到ack, 认为连接已经断开,客户端出错退出。而服务器直到发送keeplive分组后,才能知道连接已经断开,这个时间有可能超过2个小时(bsd4.4)。

Re: socket问题!

你的服务器对内个连接进行了什么处理?

Re: socket问题!

那是因为服务器不知道客户端已经断开了,可以测试的例子是在正常建立连接后,你把客户端的网线拔掉试试。
如果服务器有keepalive设置,如楼上所说,会在你设定的时间内检测客户端的存在,也有的服务器和客户端商量好,让客户端每隔一段时间向服务器发送一个hello消息,如果服务器检测过了这个时间客户端没有发送,则会主动断调客户端。

Re: socket问题!

啊? 有道理。我测试下网络中断的情况。

Re: socket问题!

嗯,目前服务器端没有做心跳方面的代码,不过我觉得我的问题应该是SOCKET协议层的问题,而不应该应用层的问题。

Re: socket问题!

呵呵!我建议你还是查查你自己代码对连接的处理吧

Re: socket问题!

服务器端主要是接收客户端的唯一连接,检验成功后,然后接收客户端发送的指令,服务器根据指令发送结果集合。

现在的问题就是出现在校验上:
当第一个连接上来后,服务器端验证该IP有一个连接上来,
当客户端死掉,服务器端阻塞读指令失败注销该连接,从而可以接收下一个该IP的连接

从SOCKET底层上来说,当客户端由于各种原因死掉后,服务器端阻塞读总会失败的,但现在即使客户端终止,服务器端阻塞读也不失败,怎么办?

Re: socket问题!

程序的代码LAN环境测试是没有问题的,放到internet上就出这毛病。

Re: socket问题!

>目前服务器端没有做心跳方面的代码,不过我觉得我的问题应该是SOCKET协议层的问题,而不应该应用层的问题。

是tcp 的一个功能 !具体参考tcp_timer.c

Re: socket问题!

>呵呵,关键是都等了几天都不见掉下来,不知道这是为啥?

真的会出现这种情况吗?有没有看错 ?

Re: socket问题!

很多办法啊 比如SELECT+非阻塞
我觉得你对CS结构的认识以及网络编程的认识比较欠缺 建议你看一下UNP 卷1和用TCP/IP实现网络互连

Re: socket问题!

设定读写超时也是很好的办法



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com