当前位置: 技术问答>linux和unix
网络连接错误 请高手指示 在线等
来源: 互联网 发布时间:2017-02-28
本文导语: 开始连接正常 通讯一段时间后 网络中断 再次能连接上 但下面的语句并没有阻塞,value一直返回-1,并且通讯命令都无效了,这是怎么回事,谢谢! value = accept(m_socket_fd, (struct sockaddr*)&client_addr, &sin_size); if (...
开始连接正常 通讯一段时间后 网络中断 再次能连接上 但下面的语句并没有阻塞,value一直返回-1,并且通讯命令都无效了,这是怎么回事,谢谢!
value = accept(m_socket_fd, (struct sockaddr*)&client_addr, &sin_size);
if (value == -1)
{
perror("accept ERROR:");
}
value = accept(m_socket_fd, (struct sockaddr*)&client_addr, &sin_size);
if (value == -1)
{
perror("accept ERROR:");
}
|
while(1)
{
······
······
value = accept(m_socket_fd, (struct sockaddr*)&client_addr, &sin_size);
if (value == -1)
{
if (value == EINTR) continue;
perror("accept ERROR:");
}
······
······
}
这样你在运行一下试试,我怀疑是你在运行接收链接的时候又中断请求发生了!!!
{
······
······
value = accept(m_socket_fd, (struct sockaddr*)&client_addr, &sin_size);
if (value == -1)
{
if (value == EINTR) continue;
perror("accept ERROR:");
}
······
······
}
这样你在运行一下试试,我怀疑是你在运行接收链接的时候又中断请求发生了!!!
|
#define EMFILE 24
EMFILE The per-process limit of open file descriptors has been reached.
服务端用的是线程还是进程?
EMFILE The per-process limit of open file descriptors has been reached.
服务端用的是线程还是进程?
|
描述符用满了,建议你perror看看错误是什么。
需要打开描述符限制,命令如下,放在/etc/rc.local即可
ulimit -SHn 65535
需要打开描述符限制,命令如下,放在/etc/rc.local即可
ulimit -SHn 65535
|
++
修改方法6楼都说了
以root用户运行以下命令:ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。
linux 默认的进程打开文件上限是1024个,可以通过ulimit -n查看。
方法一:可以通过修改/etc/security/limits.conf文件改变,如果希望把所有用户的进程打开文件上限改为65536,可以加入下面两行
* soft nofile 8192
* hard nofile 8192
还可以只真对某个用户或某个组做修改,具体方法参见文件注释。修改后需要重新启动系统才能生效
方法二:ulimit -HSn 8192
方法三:在Linux内核2.2.x中可以用如下命令修改:
# echo '8192' >; /proc/sys/fs/file-max
# echo '32768' >; /proc/sys/fs/inode-max
并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时配置以上值。
如何想知道当前进程打开了多少个文件句柄,使用:
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
第一列是打开的文件句柄数量,第二列是进程号。
第一行第二列为打开最多文件句柄的进程号,使用ps查看哪个进程:
ps aux|grep 进程号