socket:收听积压并接受

时间:2016-12-12 14:19:02

标签: c linux sockets server listen

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);
}

在我自己的电脑上,我执行服务器,等待客户端 然后我执行两个客户端,它们都可以发送和接收消息。

这是我不明白的:
为什么我的服务器可以接受两个不同的客户端(两个不同的套接字)? 我为服务器的backlog设置1的参数为listen,为什么它仍然可以容纳多个客户端?

1 个答案:

答案 0 :(得分:2)

来自the man

  

backlog参数定义队列的最大长度          sockfd的挂起连接可能会增长。 如果是连接请求          队列满时到达,客户端可能会收到错误          指示ECONNREFUSED ,或者,如果基础协议支持          重传,请求可以被忽略,以便稍后重新尝试          在连接成功。

强调我的

在您的情况下,这意味着如果同时连接,则其中一个可能会收到错误。