socket 客户端和服务都长时间连接,会出现连接不上

    socket服务端,长时间和客户端连接,接收客户端的数据,服务端会删除连接异常的socket连接,在重新创建和客户端socket连接,大概一天左右,客户端连上服务端,但不能通信。原因是服务端的端口没有更多的分配,造成的。 因为客户端频繁和服务端,创建socket连接。  

   思路: 关闭现有的socket连接,在睡眠一段时间,在建立socket连接,

    socket完全关闭

        socket.shutdown()

        socket.close()

    问题: 服务端close socket连接,在开启socket服务。到出现 ValueError: file descriptor cannot be a negative integer (-1) 错误。

  因为是和客户端的tcp连接没有都关闭。  通过netstat -ano | grep port 查看tcp连接

tcp        0      0 ***:*     180.166.248.170:4437    ESTABLISHED off (0.00/0/0)
tcp        0      0 ***:*     180.166.248.170:4389    ESTABLISHED off (0.00/0/0)
tcp        0      0 ***:*     180.166.248.170:4364    ESTABLISHED off (0.00/0/0)
tcp        0      0 ***:*     180.166.248.170:4458    ESTABLISHED off (0.00/0/0)

还有tcp建立连接,关闭后出现 的是FIN_WAIT2   timewait 。

timewait. 默认是4分钟关闭。可以通过修改内核,减短回收时间。

修改/etc/sysctl.conf,添加如下几行:

#改系統默认的TIMEOUT时间
net.ipv4.tcp_fin_timeout=2

#开启TCP连接中TIME_WAIT sockets的快速回收 默认为0 表示关闭
net.ipv4.tcp_tw_recycle=1
 

 

 

参考1 

参考2

参考3

发布了119 篇原创文章 · 获赞 2 · 访问量 2万+
展开阅读全文

socket连接运行一段时间后无法正常通信.

03-29

小弟目前在负责一个socket相关的小项目,具体流程很简单,服务端向客户端发送数据,客户端接收到数据后进入睡眠,然后由第三方工具唤醒客户端,唤醒后服务端继续想客户端发送数据,客户端继续进入睡眠,如此一直循环. 目前小弟碰到的问题是:当循环运行到一定圈数后(有时几百圈,有时一千多圈),服务端send()方法运行过后,客户端却接收不到数据,一直阻塞在receive()方法这. 此时我用netstat -nao查看tcp连接,状态是established 还有就是服务端代码是有python写的,客户端代码是c#,我在客户端设置了socket.ReceiveTimeout(120000),当receive两分钟未收到数据,就会报异常,在catch语句里面关闭连接并重新连接;方法如下 ``` socket.shutdown(SocketShutdown.Both); socket.close(); socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(ip,8002); socket.Connect(endPoint); ``` 但是重新连接后依然无法接收数据,只能一直等待两分钟报错后重连,然后继续报错.但是如果我在运行正常的情况下断开WiFi然后重连,程序是可以继续运行的.. 这个问题已经困扰小弟一两个月了,希望有大佬能够帮小弟分析一下原因,万分感谢!!! 宁外,今天小弟发现服务端python代码在创建socket的时候用的是 ``` s = socket.socket() ``` 而不是 ``` s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 即未指定ipv4协议和流,不知道是不是因为这个的原因(还未验证) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览