多线程 Socket 监听 多个终端同时并发登录 系统有时候崩溃
底层socket通信,由于tcp安全协议,一次成功后,socket状态会由ESTABLISHED变为TIME_WAIT状态,该状态下的socket是不可用的,线程数达到几万后,系统响应就会变的很差,所以在多线程操作的时候一定要主动关闭socket,还有就是要对系统进行优化,可以设置socket状态为time_wait时仍然可用,linux中是这样设的:
/etc/sysctl.conf文件
net.ipv4.tcp_tw_reuse = 1
其中还有其它参数如:
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.ip_local_port_range
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets
还有就是socket服务端响应请求体内容的大小,例如登陆操作用户名密码,服务端只回应true或者false,则速度要比回应一大堆用户信息快的多
适当优化,可达到很大的吞吐量
------------------------------------------------------------------
你这种情况,在《Unix网络编程 第1卷:套接口API》的第5.13小节有一定的介绍。
如果你的socket程序并没有处理 SIGPIPE 信号的话,由于该信号的缺省行为是终止进程,因此,当发生网络错误的时候,你的socket进程很可能被终止,导致程序崩溃。
一般情况只会是程序崩溃,整个Linux系统崩溃的可能性应该很小吧,不知道你指的系统崩溃是否表达的是整个系统崩溃?
--------------------------------------------------------------------
如果是在Windows Server上,需要注意几个相关参数的设置
MaxUserPort、MaxHashTableSize、MaxFreeTcbs。
这些决定了服务器能够提供的用于处理socket连接的硬件资源,具体信息可以百度一下。