套接字:使用backlog进行侦听并接受
套接字:使用backlog进行侦听并接受,c,linux,sockets,server,listen,C,Linux,Sockets,Server,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 = acc
倾听(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);
}
//服务器
//初始化服务器的sockaddr
server.sinu family=AF\u INET;
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sin_port=htons(8888);
结合(…);
听(sock,1);
而((client_sock=accept(…))
{
//为一个客户端创建一个线程
if(pthread_create(&sniffer_thread,NULL,connection_handler,(void*)new_sock)<0)
{
perror(“无法创建线程”);
返回1;
}
}
//客户
server.sin_addr.s_addr=inet_addr(“127.0.0.1”);
server.sinu family=AF\u INET;
server.sin_port=htons(8888);
连接(…);
而(1)
{
scanf(“%s”,消息);
//发送一些数据
如果(发送(sock,message,strlen(message),0)<0)
{
看跌期权(“发送失败”);
返回1;
}
//从服务器接收回复
if(recv(sock,server_reply,2000,0)<0)
{
看跌期权(“recv失败”);
打破
}
放置(“服务器回复:”);
puts(服务器应答);
}
在我自己的电脑上,我执行正在等待客户端的服务器。然后我执行两个客户端,它们都可以发送和接收消息。
我不明白的是:
为什么我的服务器可以接受两个不同的客户端(两个不同的套接字)?
我将
backlog
的参数设置为服务器的listen
的1
,为什么它仍然可以容纳多个客户端?
backlog参数定义队列的最大长度
sockfd的挂起连接可能会增加如果有连接请求
当队列已满时到达,客户端可能会收到错误消息
指示ECONREFUNCE或,如果基础协议支持
重新传输时,请求可能会被忽略,以便稍后重新尝试
at连接成功
重点矿山
在您的情况下,这意味着如果同时请求连接,其中一个can将接收回错误 你的“意见”是错误的。如果您想限制在任何时候都可以建立的连接数量,那么必须在代码中这样做<代码>积压工作仅处理尚未完全处理的新连接请求,而不是已建立的连接。@twalberg OK。现在我明白了。谢谢。