当前位置: 技术问答>linux和unix
一个socket服务器端,当客户端数目多时总是连接不上!
来源: 互联网 发布时间:2015-08-02
本文导语: 问题描述在这里,请大侠赐教: http://community.csdn.net/Expert/topic/3402/3402645.xml?temp=.7895014 | 什么操作系统, 有些操作系统有最大数连接数目限制 | 那应该是程序本身的问题了. ...
问题描述在这里,请大侠赐教:
http://community.csdn.net/Expert/topic/3402/3402645.xml?temp=.7895014
http://community.csdn.net/Expert/topic/3402/3402645.xml?temp=.7895014
|
什么操作系统, 有些操作系统有最大数连接数目限制
|
那应该是程序本身的问题了.
|
server的问题。你可以加些打印,看server在什么地方出错关闭socket的。
|
看你在监听的时候设置了最大的监听等待队列数,不过在Linux中的默认值为2401,是否超过了这个数?
还有你监听的数目越多,所需要的系统资源也会越多,你的系统资源能够监听很多连接吗?
还有你监听的数目越多,所需要的系统资源也会越多,你的系统资源能够监听很多连接吗?
|
开大listen的backlog数,它是accept和下一次accept之间挂起的用户请求数目。如果超过这个数目的连接请求就会被拒绝,就是这样的错误信息。
|
同意楼上,可能是server程序accept处理不过来,很多在等待状态。
|
listen(x,x2)x2开大点试试
|
同时打开的文件句柄数有限制的。ulimit -a可以看到。
|
如果你的客户端连接不上是connect出错,看一下errno.如果是因为没有回包,要看你的server处理到哪一步。程序写得不好。Nonblock socket的很多读写没有错误处理,错误消息很少。结构不好,象个大杂烩。
|
nofiles(descriptors) 1024!
|
嗯,最多1024个打开文件。另外,如果用的是线程处理的话,还受到堆栈内存的限制。
|
还是从accept报错的地方把错误的errno,以及perror出来看看吧。
|
tcpdump 查查网络包的状态
|
一个进程同时打开的文件句柄时有限制的,你可以看看这个超过了没
|
从你上面列出的系统限制信息来看,在打开的文件描述字和堆栈方面都有限制,其实,每个socket也是一个文件描述字的.
客户端打印消息:: Connection reset by peer
从这里来看是服务器端出问题了.
客户端打印消息:: Connection reset by peer
从这里来看是服务器端出问题了.
|
不好意思,没写完不小心按提交了。
续上
在linux下,对于每个socket,内核维护2个队列:
1:未完成的连接队列
客户端发送的SYN分节已到达服务器端,服务器正在等待完成相应的TCP三路握手过程。内核将这样的客户放置在未完成连接的队列中,这些socket处于SYN_RCVD状态。
2:已完成的连接队列
每个已完成三路握手的客户存放在此队列中,这些socket处于ESTALISHED状态。
accept每次从已完成的连接队列中取出一个客户。如果此队列为空,那么服务器端的进程就进入睡眠状态(假设socket为缺省的阻塞方式)
当一个客户的SYN到达时,若这两个队列都是满的,TCP就会忽略这个SYN,客户端就会连接不上。
在比较繁忙的服务器端,应该采用多线程,主线程监听,每来一个客户端,开一个线程去处理该客户端。
listen()
while(true)
{
accept()
pthread_create()
}
而且,while循环中的代码尽量减少,执行越快越好。
续上
在linux下,对于每个socket,内核维护2个队列:
1:未完成的连接队列
客户端发送的SYN分节已到达服务器端,服务器正在等待完成相应的TCP三路握手过程。内核将这样的客户放置在未完成连接的队列中,这些socket处于SYN_RCVD状态。
2:已完成的连接队列
每个已完成三路握手的客户存放在此队列中,这些socket处于ESTALISHED状态。
accept每次从已完成的连接队列中取出一个客户。如果此队列为空,那么服务器端的进程就进入睡眠状态(假设socket为缺省的阻塞方式)
当一个客户的SYN到达时,若这两个队列都是满的,TCP就会忽略这个SYN,客户端就会连接不上。
在比较繁忙的服务器端,应该采用多线程,主线程监听,每来一个客户端,开一个线程去处理该客户端。
listen()
while(true)
{
accept()
pthread_create()
}
而且,while循环中的代码尽量减少,执行越快越好。
|
TCP/IP工作原理
在linux下,对于每个socket,内核维护2个队列:
1:未完成连接的队列
在linux下,对于每个socket,内核维护2个队列:
1:未完成连接的队列