This function places a socket at a state where it is listening for an incoming connection.
int listen(
SOCKET s,
int backlog
);
Parameters
s
[in] Descriptor identifying a bound, unconnected socket.
backlog
[in] Maximum length of the queue of pending connections. If backlog is set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value.
backlog:意思是否表示此socket最多可以链接的数量?
我发现,我无论把这个参数设置成1,但是却可以同时被多个client链接。
程序的主要实现:
线程A:
while循环调用accept。
这个函数返回之后,如果没有错误;
就再创建一个线程,把这个返回的SOCKET的地址传到下一个线程B。
线程B:(线程B可以被创建很多个)
专门负责recv那个SOCKET的数据。
然后处理数据。
我遇到的问题有2个。
1:listen设置的最大连接数,无效。
2:当我用一个client,不停的链接server,并且只发一段字符,就关闭socket的时候。
server端的accept就会一直返回并且都没有错误。
然后线程就会一直的被创建,销毁。
但是线程创建销毁消耗的时间,远比client链接,发送,关闭的多的多。
所以server就会不堪重负。这个问题,怎么解决?
还是我设计的这个多连接本身就有问题。
6 个解决方案
#1
那个数表示的是连接等待队列大小,即已经完成3次握手,但还有有从队列中取出的连接数据
调用accept之后就将连接从等待队列中取出了
你可以把那个数设置成1, 然后不调用accept,看看这时候可以有几次connect成功
调用accept之后就将连接从等待队列中取出了
你可以把那个数设置成1, 然后不调用accept,看看这时候可以有几次connect成功
#2
但还有有从队列中取出的连接数据 = 但还
没有从队列中取出的连接数据
#3
第二个问题可以搜索一下socket io模式,有多种解决办法
#4
这句可以解释一下不?
没听懂。
没听懂。
#5
哈哈,表示我上面打错了,下面更正
但是还没有从等待队列中取出的连接
#6
listen实验之后,懂了。
表示的只是可以被链接的队列。
IO模型,Linux下好像只能用select写了。
这个多链接还真蛋疼。
表示的只是可以被链接的队列。
IO模型,Linux下好像只能用select写了。
这个多链接还真蛋疼。
#1
那个数表示的是连接等待队列大小,即已经完成3次握手,但还有有从队列中取出的连接数据
调用accept之后就将连接从等待队列中取出了
你可以把那个数设置成1, 然后不调用accept,看看这时候可以有几次connect成功
调用accept之后就将连接从等待队列中取出了
你可以把那个数设置成1, 然后不调用accept,看看这时候可以有几次connect成功
#2
但还有有从队列中取出的连接数据 = 但还
没有从队列中取出的连接数据
#3
第二个问题可以搜索一下socket io模式,有多种解决办法
#4
这句可以解释一下不?
没听懂。
没听懂。
#5
哈哈,表示我上面打错了,下面更正
但是还没有从等待队列中取出的连接
#6
listen实验之后,懂了。
表示的只是可以被链接的队列。
IO模型,Linux下好像只能用select写了。
这个多链接还真蛋疼。
表示的只是可以被链接的队列。
IO模型,Linux下好像只能用select写了。
这个多链接还真蛋疼。