2015-09-08 2 views
1

Je suis novice en matière de programmation de socket et j'essaie ici de configurer une simple socket serveur et de l'écouter. Voici mon code.La liaison a échoué: Descripteur de fichier incorrect

int server_socket, client_socket, sent; 
    size_t len; 
    struct sockaddr_in server, client; 
    char msg[] = "Hello to the world of socket programming"; 
    server_socket == socket(AF_INET, SOCK_STREAM, 0); 

    if(server_socket == -1){ 
     perror("Socket creation failed: "); 
     exit(-1); 
    } 

    //define server 
    server.sin_family = AF_INET; 
    server.sin_port = htons(10000); 
    server.sin_addr.s_addr = INADDR_ANY; 
    memset(&server.sin_zero, '\0', 8); 


    len = sizeof(struct sockaddr_in); 

    if((bind(server_socket, (struct sockaddr*)&server, len)) == -1){ 
     perror("Bind failed: "); 
     exit(-1); 
    } 

    if(listen(server_socket, 5) == -1){ 
     perror("Listen failed: "); 
     exit(-1); 
    } 

    while(true){ 

     if((client_socket = accept(server_socket, (struct sockaddr *)&client, (socklen_t *)&len)) == -1){ 

      perror("Accept failed: "); 
      exit(-1); 
     } 

     sent = send(client_socket, msg, strlen(msg), 0); 

     printf("Sent %d byte to client: %s\n", sent, inet_ntoa(client.sin_addr)); 

     close(client_socket); 

    } 

Je continue à obtenir

Bind Failed : Bad file descriptor 

Cependant, mon descripteur de fichier est exactement selon le guide de beej. De l'aide?

+0

cette ligne: 'memset (& server.sin_zero, '\ 0', 8);' est très 'iffy'. mieux vaut (avant de définir des champs dans memset 'server' (& server, '\ 0', sizeof (server)), et supprimer l'appel en cours à memset() – user3629249

+0

Avez-vous #include tous les fichiers d'en-tête nécessaires? le code manque: info: stdio.h stdlib.h sys/types.h sys/socket.h netinet/in.h arpa/inet.h et peut-être quelques autres Avez-vous compilé le code avec tous les avertissements activés ? (pour gcc, à une utilisation minimale: '-Wall -Wextra -pedantic') – user3629249

Répondre

3

Voici votre problème:

server_socket == socket(AF_INET, SOCK_STREAM, 0); 

Vous n'êtes pas attribuer quoi que ce soit à server_socket. Vous le comparez à la valeur de retour de socket. Vous devez faire ceci:

server_socket = socket(AF_INET, SOCK_STREAM, 0); 

Depuis que vous écoutez sur une socket TCP, vous devrez également faire:

int option=1; 
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&option,sizeof(option)); 

Cela permettra d'éviter l'application de l'expérience « Adresse déjà utiliser "des erreurs si elle est tuée et redémarrée dans un court laps de temps.

+0

Merci qui a aidé, mais maintenant je reçois Bind a échoué:: Adresse déjà utilisée –

+0

@Clockwork Voir mon edit – dbush

+0

Dans mon application, J'aurais besoin de l'utilisateur pour exécuter le programme explicitement en tant que client ou serveur en utilisant un numéro de port spécifique, comme l'application c 2345 ou l'application 2341. Dois-je encore utiliser setsockopt? –

1

On dirait qu'il est causé par une faute de frappe:

server_socket == socket(AF_INET, SOCK_STREAM, 0); 

devrait être:

server_socket = socket(AF_INET, SOCK_STREAM, 0);