2012-12-11 4 views
2

Voici l'affaire, j'écris un simple serveur de socket tcp en C (avec des appels système Unix) que je ne suis pas en mesure d'accepter les connexions. D'après ce que je peux dire, je passe très bien l'initialisation du serveur, mais quand j'essaie de me connecter au port que j'imprime (voir le code ci-dessous), il refuse comme si rien n'était là. Plus précisément, quand je netstat ce port n'est même pas utilisé. Je ne jette aucune erreur avec ma configuration actuelle, je suis tout desséché pour des idées.Le serveur de socket Unix C n'accepte pas les connexions

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**/ 

} 
+1

Avez-vous vérifié iptables et SELinux? – anishsane

+1

Vérifiez si votre pare-feu a bloqué ces ports. – askmish

+0

vérifié et effacé. Ce sont les ports que le noyau a assignés automatiquement en demandant de lier le socket à '0' donc j'imaginais que c'était le cas, mais ça valait le coup de vérifier à nouveau – darkpbj

Répondre

1

accessoires pour @askmish pour inspirer celui

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

devient

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

Etes-vous vraiment en train 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 seulement un ensemble de commentaires, ces numéros de port ne sont pas appliqués.

Editer: un autre indice. Le numéro de port doit être commande réseau, l'affectation doit donc utiliser htons(). Il se peut que les "nombres aléatoires" que vous obtenez soient des nombres simples qui semblent déformés parce que vous pourriez être sur une machine little-endian (comme Intel). Lorsque vous les imprimez, convertissez-les en utilisant ntohs().

+0

Et si vous essayez d'écouter sur le port zéro ... Je suis surpris 'bind' réussit – Useless

+0

Hmm, je pensais que la liaison à 0 (bind (2)) attribuerait automatiquement un port. Je vérifie pour s'assurer que cela se produit quand j'appelle getsockname avant d'écouter le descripteur de socket. (c'est-à-dire bonne prise, mais je vérifie que cela est correct dans le code) – darkpbj

+1

@darkpbj où est-ce que cela dit dans le manuel? et si bind affecte un port arbitraire, comment sauriez-vous à laquelle vous connecter? – iabdalkader

1

Dans votre code:

  • Au lieu de:

    serv_addr.sin_port = 0; 
    

    essayez ceci:

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

    listen(sock_fd,32); 
    

    essayez ceci:

    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);} 
    
  • également pour:

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

    Ajouter ceci:

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

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

+0

Tous les bons conseils, et de travailler à travers cela m'a aidé à arriver à la réponse que je viens de poster – darkpbj

Questions connexes