sudo netstat -antp не показывает PID

458
joseph M'Bimbi-Bene

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

я написал очень простой 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? Может кто-нибудь объяснить мне, что происходит?

0
Какое отставание для принятия? Я подозреваю, что это 2. Eugen Rieck 6 лет назад 0
Если я правильно понимаю, и отставание - это размер очереди ожидающих входящих соединений, то, как показывает код, это 5. Кстати, я также понял, что сервер может установить соединение с еще 2 клиентами, чем указано в Отставание, я, вероятно, отправлю еще один вопрос относительно этого joseph M'Bimbi-Bene 6 лет назад 0

1 ответ на вопрос

0
Eugen Rieck

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

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

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