2010-12-08 23 views
2

J'ai rencontré un hasard bizarre où les résultats de monport TCP sortant correspond le port d'écoute

lsof | grep 40006 

produit

java  29722  appsrv 54u  IPv6   71135755  0t0  TCP localhost:40006->localhost:40006 (ESTABLISHED) 

En général, je vois

java  30916  appsrv 57u  IPv6   71143812  0t0  TCP localhost:43017->localhost:40006 (ESTABLISHED) 

où les ports font ne correspond pas de chaque côté de la flèche. Alors que lsof produisait le premier résultat, je ne pouvais pas démarrer une application qui tente d'écouter sur le port 40006 même si le socket est configuré comme SO_REUSEADDR.

Est-ce que cela peut arriver? Devrait-il?

uname donne: Linux femputer 2.6.32-24-server # 39 Ubuntu SMP Mer 28 juillet 2010 06:21:40 UTC x86_64 GNU/Linux

+0

Remarque: pour le premier résultat lsof, l'écoute de l'application sur 40006 a été interrompue. – user535674

Répondre

1

Il est possible d'organiser une telle connexion en créant une socket, la lier à 127.0.0.1:40006, puis connect() à 127.0.0.1:40006. (Remarque: no listen()). Je crois que cela s'appelle un "actif-actif ouvert".

Le programme suivant montre ceci:

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <unistd.h> 

int main() 
{ 
    int s; 
    struct sockaddr_in sa = { 
     .sin_family = PF_INET, 
     .sin_port = htons(40006), 
     .sin_addr.s_addr = htonl(INADDR_LOOPBACK) }; 

    s = socket(PF_INET, SOCK_STREAM, 0); 

    if (s < 0) { 
     perror("socket"); 
     return 1; 
    } 

    if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) { 
     perror("bind"); 
     return 1; 
    } 

    if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) { 
     perror("connect"); 
     return 1; 
    } 

    pause(); 

    return 0; 
} 

La raison pour laquelle le port ne peut pas être réutilisé est parce que le port n'écoute pas - il est un port de sortie.

+0

J'ai omis quelque chose dans la deuxième sortie de lsof que je regrette maintenant. Le résultat du premier coup était l'impression complète. Le deuxième dans son intégralité est – user535674

+0

java 30916 appsrv 57U IPv6 71143812 0t0 TCP localhost: 43017-> localhost: 40006 (CRÉÉ) \ n monapp 30957 appsrv 4u IPv4 71143810 0t0 TCP *: 40006 (ECOUTER) \ n monapp 30957 appsrv 5U IPv4 71143811 0t0 TCP localhost: 40006-> localhost: 43017 (ESTABLISHED) Pour le cas du premier résultat lsof, myapp a été arrêté à ce moment et la ligne présentée a persisté après que j'ai trouvé que je ne pouvais pas le redémarrer. Peut-être que myapp ne s'est pas éteint proprement? Je vais vérifier le code d'arrêt. – user535674

+0

Je suppose que le côté gauche de l'hôte local: 43017-> localhost: 40006 partie est aléatoire, je ne sais pas quoi chercher pour savoir quels sont les facteurs à l'intérieur. Je pensais qu'il y aurait des mécanismes pour empêcher le chevauchement, mais je n'ai aucune idée de ce qu'ils sont s'ils ne sont pas activés par défaut. – user535674

0

Se pourrait-il que les deux ports 40006 étaient différents interfaces?

+0

Il n'y a qu'une seule interface sur l'ordinateur. – user535674

+0

Sauf si une distinction est faite entre lo et eth0, puisque les deux applications se trouvent sur le même ordinateur et se connectent via le nom d'hôte localhost. – user535674