2016-12-12 6 views
1

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

Ваше «мнение» неверно. Если вы хотите ограничить количество подключений, которые могут быть установлены в любой момент, вы должны сделать это в своем коде. 'backlog' обрабатывает только новые запросы на соединение, которые еще не были полностью обработаны, а не установлены соединения. – twalberg

+0

@twalberg OK. Теперь я понимаю. Большое спасибо. – Yves

ответ

2

От the man

Отставание аргумента определяет максимальную длину, к которому очередь ожидающих соединений для sockfd может расти. Если запрос на соединение приходит, когда очередь заполнена, то клиент может получить сообщение об ошибке с индикацию ECONNREFUSED или, если основной протокол поддерживает повторную передачу, запрос может быть проигнорирован, так что позже повторить попытку на соединение успешно ,

Упор шахта

В вашем случае это означает, что если одновременных соединений предлагается один из тех, кто может получит обратно сообщение об ошибке.