Le serveur de socket Unix C n’accepte pas les connexions

Voici le problème, j’écris un simple serveur de socket TCP en C (avec des appels système Unix) que je ne parviens pas à accepter les connexions.

D’après ce que je peux dire, l’initialisation du serveur me convient parfaitement, mais lorsque j’essaie de me connecter au port que j’imprime (voir le code ci-dessous), il refuse comme si rien ne s’y trouvait.

Plus précisément, lorsque je netstat, ce port n’est même pas utilisé. Je ne lance pas d’erreurs dans ma configuration actuelle, je suis à court d’idées.

int main(){ int sock_fd; int conn_fd; struct sockaddr_in serv_addr; struct sockaddr_in cli_addr; socklen_t* serlen; socklen_t* clilen; clilen = malloc(sizeof(socklen_t)); serlen = malloc(sizeof(socklen_t)); *serlen = sizeof(serv_addr); *clilen = sizeof(cli_addr); /*=============================Create Socket=============================*/ //Create Socket sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(sock_fd<0){ fprintf(stderr,"error creating socket\n"); exit(1);} //Initialize Server Address Struct bzero((char *) &serv_addr, *serlen); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = 0; /*=============================Bind Address==============================*/ //Bind socket to an address if(bind(sock_fd,(struct sockaddr*)&serv_addr,*serlen)<0){ fprintf(stderr,"error binding\n"); exit(1);} //Get socket data if(getsockname(sock_fd,(struct sockaddr*)&serv_addr, serlen)<0){ fprintf(stderr,"error with socket name"); exit(1);} /*=============================Server Started============================*/ //Listen for connections listen(sock_fd,32); //Print port printf("%i", serv_addr.sin_port); conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen); /**Do something exciting with my new connection**/ } 

    Est-ce que vous essayez vraiment d’écouter sur le port zéro? Essayez un numéro de port élevé, de préférence> 1024. / etc / services donnera un indice sur les ports libres – mais il ne s’agit que d’un ensemble de commentaires, ces numéros de port n’étant pas appliqués.

    Edit: un autre indice. Le numéro de port doit être dans l’ ordre du réseau , l’affectation doit donc utiliser htons() . Il se peut que les “nombres aléatoires” que vous obtenez soient de simples nombres qui semblent brouillés parce que vous êtes peut-être sur une machine little-endian (comme Intel). Lorsque vous les imprimez, reconvertissez-les à l’aide de ntohs() .

    Dans votre code:

    • Au lieu de:

       serv_addr.sin_port = 0; 

      essaye ça:

       serv_addr.sin_port=htons(2056);//Any port no. 
    • Au lieu de:

        listen(sock_fd,32); 

      essaye ça:

        if(listen(sock_fd,SOMAXCONN)<0)//Just to be sure that you are considering max. no. of requests { fprintf(stderr,"error with listen"); exit(1);} 
    • Aussi pour:

        conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen); 

      Ajoute ça:

        if(conn_fd <0) { //handle the error here } 

    Si aucun de ces problèmes ne résout vos problèmes, alors, il pourrait y avoir un problème avec le code client ou votre environnement de serveur.

    accessoires à @askmish pour avoir inspiré celui-ci

      //Print port printf("%i", serv_addr.sin_port); 

    devient

      //Print port printf("%i", htons(serv_addr.sin_port));