当前位置: 技术问答>linux和unix
TCP服务端程序意外重启后,客户端连接不上的问题求解
来源: 互联网 发布时间:2016-07-03
本文导语: 请教各位:运行在嵌入式linux环境下程序监听一个端口,等待客户端的连接请求,我试过当程序使用ctrl+c人为停止后,再立即用./xx运行起来,客户端就再也连接不上了。只有再次使用ctrl+c停止程序,等一会再重启程序...
请教各位:运行在嵌入式linux环境下程序监听一个端口,等待客户端的连接请求,我试过当程序使用ctrl+c人为停止后,再立即用./xx运行起来,客户端就再也连接不上了。只有再次使用ctrl+c停止程序,等一会再重启程序,方能连接成功。
客户端的连接失败提示是:The socket is marked as nonblocking, and the requested operation would block, and cannot be completed immediately
请问这是为什么呢?在我的程序中应该加入什么处理才能再程序意外停止后马上重启也能接受连接请求。
客户端的连接失败提示是:The socket is marked as nonblocking, and the requested operation would block, and cannot be completed immediately
请问这是为什么呢?在我的程序中应该加入什么处理才能再程序意外停止后马上重启也能接受连接请求。
|
学习了,另外
ctrl+c
的消息可以通过sigaction (SIGPIPE,........)
来处理
|
应该是因为TIME_WAITING的原因,导致服务器端端口绑定失败。解决方法:
1. 服务器端岩石启动,或者绑定失败后延时重试
2. 采用楼上的方法,设定端口复用. 不过这样的话似乎有和别的服务冲突的可能
3. 正如楼上所说,服务端应该设定信号处理函数,在终止时尽量关闭socket
1. 服务器端岩石启动,或者绑定失败后延时重试
2. 采用楼上的方法,设定端口复用. 不过这样的话似乎有和别的服务冲突的可能
3. 正如楼上所说,服务端应该设定信号处理函数,在终止时尽量关闭socket
|
你可以搜搜TIME_WAIT,Tcp/ip详解-卷1里有讲的。好像主要是针对可能的延时包而定的一种规则。
|
有一个叫MSL(好像是叫最大分节生命期)的东西,一般TIME_WAIT状态会保持2个MSL的时长。
|
我也遇到过,就像你说的那样,ctrl+c后,里面重启程序,socket提示bind error之类的,必须过一会儿在从来就可以连上了,这也是一种学习的机会,哈哈,支持楼主,我也去试试!!!!
|
通常服务器端编程为了保证及时响应,都会有端口复用,可以很好避免端口释放后的延迟!
http://topic.csdn.net/u/20090103/16/a0414edb-b289-4c72-84da-39e155e8f4be.html
http://topic.csdn.net/u/20090103/16/a0414edb-b289-4c72-84da-39e155e8f4be.html