Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在1024次连接后我的连接被拒绝?_C_Linux_Sockets - Fatal编程技术网

C 为什么在1024次连接后我的连接被拒绝?

C 为什么在1024次连接后我的连接被拒绝?,c,linux,sockets,C,Linux,Sockets,我正在本地Linux服务器上进行测试,服务器和客户端都在同一台服务器上。在大约1024次连接之后,在我的代码中,在我连接的地方,连接被拒绝了。起初我以为是fd_set_max limit为1024的select,并将服务器改为poll而不是select,但我仍然没有超过这个数字。我的ulimit-n设置为2048,我监视服务器上的lsof,它达到大约1033(不确定这是否是确切的数字),然后失败。非常感谢您提供的任何帮助。可能您已达到打开文件描述符的进程限制 我不确定我是否理解正确:服务器端和客

我正在本地Linux服务器上进行测试,服务器和客户端都在同一台服务器上。在大约1024次连接之后,在我的代码中,在我连接的地方,连接被拒绝了。起初我以为是fd_set_max limit为1024的select,并将服务器改为poll而不是select,但我仍然没有超过这个数字。我的ulimit-n设置为2048,我监视服务器上的lsof,它达到大约1033(不确定这是否是确切的数字),然后失败。非常感谢您提供的任何帮助。

可能您已达到打开文件描述符的进程限制

我不确定我是否理解正确:服务器端和客户端是否在同一个过程中?然后您将使用两倍的文件描述符。这与你在ulimit身上看到的非常接近。如果不是这样的话,问题是否会出现在服务器端?可能服务器进程耗尽了描述符,无法再接受更多连接

其中提到您应该获得以下返回值:

EMFILE
已达到每个进程打开的文件描述符的限制

ENFILE
已达到打开文件总数的系统限制

你得到了什么错误代码?显然,您只能将已成功接受的连接添加到select或poll中

我知道您已经知道如何检查ulimit,但其他人可能不知道:

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 40448
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 40448
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

服务器是否存在为其接受的每个连接打开单独日志文件的危险

另一组说服务器有什么上限


我在几年前看过的一个程序中有一段代码将最大文件大小设置为1MB遗憾的是,当它第一次被添加时,它增加了大小,但随着时间的推移和文件限制的增长,意味着后来它正在缩小大小!服务器是否存在类似的问题?它将打开的文件的最大数量设置为1024个这样的高得离谱的数字?

对于大多数琐碎的问题表示歉意:)
当您说“更改为轮询”时,是否重新编译了服务器?服务器是否在同一帐户下运行?它是
fork
-ing还是线程服务器?在客户端上调用
connect()
后,是否会得到
errno==econnrefered
?您是否可以确认使用
tcpdump
响应
SYN
,获得
RST
?客户端端口号是否得到重用?是否有处于等待状态的连接?

如果连接速度超过服务器调用的
accept()
,则挂起的连接队列可能已满。最大队列长度由服务器中的第二个参数设置为
listen()
,如果较低,则设置为
sysctl net.core.somaxconn
(通常为128)。

您的限制来自linux用户限制。如果未指定,linux限制为1024个打开的文件。若要永久更改,请编辑/etc/security/limits.conf并添加

用户软件文件16535 用户硬文件16535

或者从控制台试试

乌利米特-n 16535


经过进一步研究后,我认为。。看起来我的服务器端侦听的队列深度为20。我想这就是原因。你们当中有人认为这也是问题所在吗


关于

我在错误处理例程中看到了您对close(sock_fd)语句的评论

是否在使用套接字后显式关闭它们-close()或shutdown()


我想不会。您实际上有1024个以上的并发活动连接?要做到这一点,必须涉及pthreads。对吗?

我也有同样的症状。即使在增加ulimit-n之后,我仍然无法处理超过1024个输入连接

我的问题是我使用了select,它不能处理1024以上的套接字FDs。所以,当我提高我的限制时,我的问题实际上改变了!!!(一开始我没有注意到…)

因此,要帮助任何有类似问题的人:

如果您想要超过1024个插座,则必须

  • 增加开放式FDs的限额(ulimit-n)
  • 您可以不使用select()(而使用poll())

感谢您的快速响应,让我更详细地解释一下,因此服务器和客户端都是机器中两个独立的进程。服务器更像是一个跟踪所有新客户端进程的管理器。因此,客户端进程向侦听端口的服务器注册自身。一旦~1024个客户端注册,未来的客户端就会被拒绝连接。我检查了ulimit-a,软限制设置为2048,硬限制设置为4096。@Gentoo服务器的accept调用中有错误吗?如果是,是哪一个?@Gentoo很遗憾,您需要知道accept的服务器返回值。也许在服务器上使用strace会对此有所帮助。@lothar所以我正在处理另一个组提供给我的服务器,在我的客户端代码中,下面的连接给出了连接拒绝错误
if(connect(sock_fd,(struct sockaddr*)&serv_addr,(int)sizeof(serv_addr))<0{LOGSTRM(LEVEL_error)感谢lothar。我将尝试这样做。感谢..不知道此设置..在我开始工作时将检查我的系统…可能不会,老实说,尽管可能会。队列深度是有多少未完成(不完整)请求已发出。如果您在前一个请求完成之前向服务器发送大量连接请求,则可能;如果您同步发出请求,则可能不会。因此,这是2000个用户的自动工作负载,并且用户连接未同步。这就是我认为队列深度可能是问题的原因。我的服务人员问道r团队更换深度并等待测试。