2017-10-04 5 views
0

Je suis en train d'implémenter un serveur d'écho multithread dans gcc sous linux. Je lie la socket serveur au numéro de port 3000. Ci-dessous est mon code utilisé pour la liaison.Le socket serveur ne se lie pas au port spécifié

EchoServer.c

struct sockaddr_in sock_var; 
int serverFileDiscriptor=socket(AF_INET,SOCK_STREAM,0); 
sock_var.sin_addr.s_addr=inet_addr("0.0.0.0"); 
sock_var.sin_port=3000; 
sock_var.sin_family=AF_INET; 
bind(serverFileDiscriptor,(struct sockaddr*)&sock_var,sizeof(sock_var)); 

Cependant, je vois que le serveur se lie au numéro de port 47115 comme indiqué ci-dessous.

Proto Recv-Q Send-Q Local Address   Foreign Address   State  User  Inode  PID/Program name  
tcp  0  0 0.0.0.0:47115   0.0.0.0:*    LISTEN  0   79942  22843/./EchoServer 

Selon ma compréhension, en précisant que le numéro de port que 0 lieront le socket à un port inutilisé aléatoire. Quelle pourrait être la raison possible de cela? Le serveur est démarré en tant qu'utilisateur root et j'ai confirmé que le numéro de port 3000 est inutilisé et disponible.

Répondre

1

J'ai trouvé le problème avec mon code. Le socket serveur se lie au numéro de port 3000 après que je change

sock_var.sin_port=3000; 

à

sock_var.sin_port=htons(3000); 

Donc, cette question a quelque chose à voir avec l'ordre des octets du réseau.

+1

Cela a à voir avec le fait que 'sockaddr_in.sin_port' est * spécifié * pour être 'port dans l'ordre des octets du réseau', * dans la page 'man'. * – EJP

+0

@EJP - Merci de clarifier. – Learner