listen(sock, backlog)
:
在我看来,参数backlog
限制连接数量。这是我的测试代码:
// server
// initialize the sockaddr of server
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
bind(...);
listen(sock, 1);
while( (client_sock = accept(...)) )
{
// create a thread for one client
if( pthread_create( &sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0)
{
perror("could not create thread");
return 1;
}
}
// client
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons( 8888 );
connect(...);
while(1)
{
scanf("%s" , message);
//Send some data
if( send(sock , message , strlen(message) , 0) < 0)
{
puts("Send failed");
return 1;
}
//Receive a reply from the server
if( recv(sock , server_reply , 2000 , 0) < 0)
{
puts("recv failed");
break;
}
puts("Server reply :");
puts(server_reply);
}
在我自己的 PC 上,我执行正在等待客户端的服务器。
然后我执行两个客户端,它们都可以发送和接收消息。
这是我不明白的地方:
为什么我的服务器可以接受两个不同的客户端(两个不同的套接字)?
我设置的参数为backlog
as 1
为了listen
服务器端为什么还能容纳多个客户端?
From the man http://man7.org/linux/man-pages/man2/listen.2.html
backlog参数定义了队列的最大长度
sockfd 的待处理连接可能会增加。如果有连接请求
当队列已满时到达,客户端可能会收到一个错误
ECONNREFUSED 的指示或者,如果底层协议支持
重传,该请求可能会被忽略,以便稍后重试
连接成功时。
Emphasis mine
在您的情况下,这意味着如果请求同时连接,其中一个连接可能会收到错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)