Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
套接字:使用backlog进行侦听并接受_C_Linux_Sockets_Server_Listen - Fatal编程技术网

套接字:使用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。现在我明白了。谢谢。