|
|
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问题!
|
|
设定读写超时也是很好的办法
|