sudo netstat -antp zeigt keine PID an

482
joseph M'Bimbi-Bene

Ich teste Zeug mit Steckdosen und bin auf diesen seltsamen Fall gestoßen:

Ich codierte ich sehr einfache TCP-Server in c, ich habe es nach Accept () blockiert, nur um zu sehen, was passiert, wenn mehrere Verbindungsversuche gleichzeitig akzeptiert werden:

Hier ist ein Auszug des Codes des Servers:

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

Wenn der Server den Benutzer auffordert, eine ganze Zahl einzugeben, versuche ich, mehrere Clients mit Telnet zu verbinden.

Für den ersten ist alles in Ordnung:

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 

Aber nach dem ersten, obwohl ich root bin, gibt es einige Verbindungen, die ich nicht sehen kann.

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 

ein dritter:

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 

Ich habe es ein paar Tage später erneut mit netstat -antpe als root versucht und hier ist was ich bekommen habe:

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 

Wie kommt es, dass ein Prozess oder eine Verbindung einen Inode von 0 haben kann? Kann mir jemand erklären, was los ist?

0
Was ist der Rückstand für die Annahme? Ich vermute, es ist 2. Eugen Rieck vor 6 Jahren 0
Wenn ich es richtig verstehe und das Backlog die Größe der Warteschlange der anstehenden eingehenden Verbindungen ist, dann ist es, wie der Code angibt, 5. Übrigens habe ich auch festgestellt, dass der Server eine Verbindung mit 2 mehr Clients herstellen kann, als in der angegeben ist Rückstand, ich werde wahrscheinlich eine andere Frage dazu posten joseph M'Bimbi-Bene vor 6 Jahren 0

1 Antwort auf die Frage

0
Eugen Rieck

Linux verwendet für das Listen-Backlog einen Ansatz mit zwei Warteschlangen. Dies bedeutet, dass zusätzlich zu den vollständigen Verbindungen (5 wie in Ihrem Code) eine Warteschlange mit unvollständigen Verbindungen vorhanden sein kann, bei der der 3way-Handshake noch nicht abgeschlossen ist.

Verbindungen in diesem Status sind noch keinem Prozess zugeordnet, sie gehören also zum Kernel und führen nur zu einer Prozess-ID 0. Dieses Bit hat mich in einer Mono / .NET-Anwendung gebissen, bei der ich in Mono nach einem Fehler suchte tatsächlich Verhalten durch Design des Kernels.

Sehen Sie hier für die zwei-queue Ansatz Details.