`
rainshow
  • 浏览: 30845 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

系统运行一段时间后,客户端不能连接上服务器(有SOCKET开发经验的欢迎一起讨论)

阅读更多
情况是这样的,我们的一台服务器连接比较多。他由两个部分组成,WEB部分和应用服务。这台服务器存在以下几种连接

1)和另外一个服务器的长连接
2)和几百台设备的短连接(服务器需要频繁访问这些设备)
3)从这台服务器的WEB到应用的短连接(需要应用转发到设备成功后再原路返回)
4)和客户端的长连接(把设备信息发送给客户端查看)

服务器刚启动时间后运行很正常,大概过了一个星期后,开始逐渐不能连接上这台服务器。
=========================================================================
这个可能是连接的相关资源耗尽了,NETSTAT一下会发现一些TIME_WAIT,还有少数的几个FIN_WAIT_1,至于具体什么耗尽了,我也说不上来。因为这种情况在测试环境中比较难模拟,还请各位有类似开发经验的能多多发表自己的意见,谢谢!
分享到:
评论
8 楼 xulu286880921 2011-08-20  
  
7 楼 ken1984 2008-01-01  
rainshow 写道
看了几篇文章传说socket.setReuseAddress(true)可以让TIME_WAIT的状态的可以重用。非常可惜的是即便是使用了这个参数也没用,后来看到好像是JDK的一个BUG,见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296




转一下
其实这个问题在Richard Stevens的《Unix网络编程指南》卷一里有很详细的
解答(中文版P166-168页)。这里我只是写几个基本的例子来验证这个问题。
    首先声明一个问题:当两个socket的address和port相冲突,而你又想重用地
址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只
有两者之一有这个特性还是有问题的。
    SO_REUSEADDR可以用在以下四种情况下。
    (摘自《Unix网络编程》卷一,即UNPv1)
    1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
    2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
    3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
    4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。

6 楼 eserver220 2007-12-31  
    检查一下网络设置是否有问题。 子网掩码是否设置过大。 arp -a看看mac表的状态。

还有有时unix会启动routed进程。看看路由表是否有问题。
5 楼 rainshow 2007-12-30  
看了几篇文章传说socket.setReuseAddress(true)可以让TIME_WAIT的状态的可以重用。非常可惜的是即便是使用了这个参数也没用,后来看到好像是JDK的一个BUG,见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296

4 楼 minyongbing 2007-12-29  
我也遇到这样类似的问题。在连接是出现了no buffer space available异常。
我的连接是有两种方式:1是建立套节字socket为客户端,向下面的设备发送消息,并接受返回的消息。2是通过建立ftp连接的方式将消息以ftp方式上传文件到下面的设备并同时下载返回文件。
在系统运行2天后出现了上面所说的异常,我的代码里面的tcp连接都有过关闭连接操作。不知道是什么原因造成的。
我的系统是win2k ser ,装了瑞星杀毒软件有防火墙。
3 楼 rainshow 2007-12-28  
timerri 写道
这个是无可用端口的问题。

对外连接时,一般使用系统分配的端口。即使关闭socket,这个socket还会被time_wait一段时间(似乎是1~2分钟左右)。根据系统不同,提供给系统自动分配的端口也是有限的(windows下仅有1000左右)。所以只要在2分钟内有过上千个连接,那么可用端口就会被消耗干净,这时候建立socket就会失败。

解决方法:不要让系统自动分配端口,而在创建socket的时候指定端口,这样可以跳出只能用1000个左右端口的限制。另外还要尽量分散连接建立的时间,不要出现短期内有高连接数的峰值。


LINUX和UNIX下一般系统自动分配的端口会有多少?
我感觉你说的比较正确,连接我可以确定都关闭了,如果不关闭也撑不到一个星期,我们系统的交易压力还是蛮大的。我先按照你的做法测试下看看。
2 楼 timerri 2007-12-28  
这个是无可用端口的问题。

对外连接时,一般使用系统分配的端口。即使关闭socket,这个socket还会被time_wait一段时间(似乎是1~2分钟左右)。根据系统不同,提供给系统自动分配的端口也是有限的(windows下仅有1000左右)。所以只要在2分钟内有过上千个连接,那么可用端口就会被消耗干净,这时候建立socket就会失败。

解决方法:不要让系统自动分配端口,而在创建socket的时候指定端口,这样可以跳出只能用1000个左右端口的限制。另外还要尽量分散连接建立的时间,不要出现短期内有高连接数的峰值。
1 楼 liyong_2003_cn 2007-12-28  
一般来说,一台机器对外连接数是有限的,象你这种情况就是连接没有释放导致的。你可以在建立连接时做计数器,来统计哪一种类型的连接占用的时间长,没有释放,应该很容易找到问题所在的,就跟连接池的处理是一个道理,你也在你的系统中建立一个类似于连接池或对象池的概念,不再由应用进行直接连接,把连接统一管理。

相关推荐

    JAVA socket收发数据,并支持断网自动连接

    实现socket客户端收发数据,并支持客户端断网或服务器重启后重连

    socket实现了tcp的服务器断和客户端

    下下来即可使用 非常好 一个客户端 一个服务器段

    C++使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    这个跟我在第二节里介绍的是一模一样的(第二节第10行),还有数据的处理函数,数据发送函数,判断连接已断开的代码与第二节也是一模一样的,不过在这里我们需要额外的添加一段代码,当判断出连接已断开的时候,我们要...

    一个简单socket集成客户端和服务器应用

    一个简单socket集成客户端和服务器应用源码,这个小应用的源码比较齐全,客户端和服务端部分的源码都已经有了,虽然有点简单,己在网上找了段时间的代码,改了一段时间的socket自的客户端和服务器端的代码,由于自己...

    Python socket网络编程TCP/IP服务器与客户端通信

    初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络...

    java基于C/S模式基于Socket实现聊天程序,有客户端和服务端,基础代码,仅演示C/S模式下的程序发送与监听原理

    这段代码实现了简单的基于Socket的客户端服务器端程序。客户端程序创建一个Socket对象并与服务器建立连接,然后从服务器接收消息并提示用户输入消息发送给服务器。服务器端程序创建一个监听Socket对象以等待客户端...

    socket实现版本自动更新升级(完整项目,直接可用)

    我这个改良的版本完好的解决了这个问题,已经在公司使用了一段时间,功能稳定完好,推荐给大家。 1、升级信息在一个autoupdate.xml 文件中,包含服务器ip、端口号;当前版本号;所需要更新的文件列表。该文件在...

    Socket编程 c语言 (最新 带例程 可直接编译运行)

    最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件...

    网络综合实验——端口扫描并连接服务器

    1.编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作。编写一个端口扫描程序,能够显示...(4)选择其中一个活动端口,建立连接并发送一个数据块,服务器收到后原样返回客户端。

    win_linux_socket_c_s

    本人正在学习socket网络编程,同时又在看多线程的编程,所以就写一段C/S通信程序。为后面从客户端发命令搜索服务器端文件并回显结果做准备

    Android基于Socket聊天室

    Android基于Socket实现的聊天室功能 注解详细 一看就懂 包含服务器和客户端 服务器是一段java代码 客户端直接运行在手机上 用DOS(MyEclipse)开启服务器 然后运行模拟器或者手机即可。 注:请将客户端代码中的ip...

    C# Socket连接请求超时机制实现代码分享

    因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。默认的等待时间长达20~30s。.Net Socket库的SocketOptionName.SendTimeout提供了控制发送数据的超时时间...

    socket工具源码

    建立Socket测试服务器端和测试客户端,并向其他端发送或接受报文数据,支持自动发送和自动应答,支持UDP和TCP; 2.录入的IP地址和端口等参数数据进行本地XML序列化,下次自动打开。(这个是我需要的,不用每次都...

    socket编程示例--聊天软件服务器端+客户端

    两段源代码均在devC++下编译通过,并在广域网上测试过可以正常通讯聊天.使用这两段代码的初学者请注意,要在编译选项里加-lws2_32 -mthreads这两句哦.不然会提示link错误.

    一段as3.0与c++socket通信的例子(as端代码)

    一段as3.0写的客户端代码,用来监听服务器端和发送数据用的一个例子。可作参考。socket通信

    使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    这个跟我在第二节里介绍的是一模一样的(第二节第10行),还有数据的处理函数,数据发送函数,判断连接已断开的代码与第二节也是一模一样的,不过在这里我们需要额外的添加一段代码,当判断出连接已断开的时候,我们要...

    unity3d 网络插件 Best HTTP Pro Edition 1.10.unitypackage

    通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,...

    diffie-hellman密钥交换协议vc++实现

    基于socket的diffie-hellman密钥交换协议的mfc实现,包含服务器端和客户端,可以在本机通信,也可以在两台机器上进行密钥交换。

    ftp服务器客户端使用方法.doc

    败环瘁糠委忱窖渭澡曰娄实味燕漠弯锋蠢伦筛绪庚窥和来喳国望吱麦唁哇烂蒂狼欣崔略 裔许置壕归赂爱颗撮扩纷疲修病恐沿貌椿恨酝氯哭郁呛鄙沽好胶搓ftp服务器客户端使用 方法准几赃贼晤豹此银申扶跌碴蛀较浆扬段寿兜娩...

Global site tag (gtag.js) - Google Analytics