я тестирую вещи с сокетами, и я столкнулся с этим странным случаем:

я написал очень простой tcp сервер в c, я сделал его блокированным после accept(), просто чтобы посмотреть, что происходит при одновременном принятии нескольких попыток соединения:

Вот выдержка из кода сервера:

//listen()
if( (listen(sock,5)) == -1) {
  perror("listen");
  exit(-1);
}

//accept()
if( (cli = accept(sock, (struct sockaddr *) &client, &len)) == 1 ){
  perror("accept");
  exit(-1);
}

printf("entrez un int : ");
scanf("%d",&toto);

когда сервер просит пользователя ввести целое число, я пытаюсь подключить несколько клиентов с помощью telnet.

Форт первый, все в порядке:

root@[...] :/home/[...]/workspace/sockets# netstat -antp | grep 10003
tcp        0      0 0.0.0.0:10003           0.0.0.0:*               LISTEN      25832/toto      
tcp        0      0 127.0.0.1:10003         127.0.0.1:51166         ESTABLISHED 25832/toto      
tcp        0      0 127.0.0.1:51166         127.0.0.1:10003         ESTABLISHED 25845/telnet

но после первого, хотя я являюсь пользователем root, есть некоторые соединения, которые я не вижу, процесс владеет им и его pid:

root@[...] :/home/[...]/workspace/sockets# netstat -antp | grep 10003
tcp        0      0 0.0.0.0:10003           0.0.0.0:*               LISTEN      25832/toto      
tcp        0      0 127.0.0.1:10003         127.0.0.1:51166         ESTABLISHED 25832/toto      
tcp        0      0 127.0.0.1:51166         127.0.0.1:10003         ESTABLISHED 25845/telnet    
tcp        0      0 127.0.0.1:10003         127.0.0.1:51168         ESTABLISHED -               
tcp        0      0 127.0.0.1:51168         127.0.0.1:10003         ESTABLISHED 25852/telnet

третий:

root@[...] :/home/[...]/workspace/sockets# netstat -antp | grep 10003
tcp        0      0 0.0.0.0:10003           0.0.0.0:*               LISTEN      25832/toto      
tcp        0      0 127.0.0.1:10003         127.0.0.1:51166         ESTABLISHED 25832/toto      
tcp        0      0 127.0.0.1:51166         127.0.0.1:10003         ESTABLISHED 25845/telnet    
tcp        0      0 127.0.0.1:10003         127.0.0.1:51172         ESTABLISHED -               
tcp        0      0 127.0.0.1:10003         127.0.0.1:51168         ESTABLISHED -               
tcp        0      0 127.0.0.1:51168         127.0.0.1:10003         ESTABLISHED 25852/telnet    
tcp        0      0 127.0.0.1:51172         127.0.0.1:10003         ESTABLISHED 25860/telnet

Я попробовал снова через несколько дней с netstat -antpe в качестве пользователя root и вот что я получил:

root@[...] :/home/[...]/workspace/sockets# netstat -antpe | grep 10003
tcp        0      0 0.0.0.0:10003           0.0.0.0:*               LISTEN      1000       327680      22399/toto      
tcp        0      0 127.0.0.1:33286         127.0.0.1:10003         ESTABLISHED 1000       417202      22884/telnet    
tcp        0      0 127.0.0.1:10003         127.0.0.1:33046         ESTABLISHED 0          0           -               
tcp        0      0 127.0.0.1:10003         127.0.0.1:33286         ESTABLISHED 0          0           -               
tcp        0      0 127.0.0.1:33044         127.0.0.1:10003         ESTABLISHED 1000       332810      22402/telnet    
tcp        0      0 127.0.0.1:33046         127.0.0.1:10003         ESTABLISHED 1000       331200      22410/telnet    
tcp        0      0 127.0.0.1:10003         127.0.0.1:33044         ESTABLISHED 1000       332801      22399/toto

как получается, что процесс или соединение может иметь индекс 0? Может кто-нибудь объяснить мне, что происходит?

1 ответ1

0

В Linux используется подход с двумя очередями к журналу ожидания прослушивания. Это означает, что в дополнение к завершенным соединениям (5, как в вашем коде) может существовать очередь неполных соединений, где 3-х стороннее рукопожатие еще не завершено.

Соединения в этом состоянии еще не назначены процессу, поэтому они принадлежат ядру, в результате чего идентификатор процесса равен 0. Это немного отразилось на Mono/.NET-приложении, где я искал ошибку в Mono, которая на самом деле была поведением ядра.

Смотрите здесь для деталей подхода с двумя очередями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .