2017-07-27 2 views
0

récemment, j'ai essayé de faire beaucoup avec les sockets C car c'est un langage dont j'ai besoin pour une utilisation future. Cependant, j'ai rencontré ce problème que je n'arrive pas à résoudre. J'ai fait à la fois le client et le serveur - malheureusement, les deux binaires refusent de se connecter entre eux. Ce que je veux dire c'est que je ne reçois aucune erreur quand j'exécute le binaire du serveur et le binaire du client dans une même machine, mais pas de connexion non plus. Des idées? Voici le code!Sockets C (Linux) ne se connecte pas

(. Ubuntu, les deux codes C compilés avec gcc, le serveur et le code client reçoit à l'intérieur de la même machine en 2 bornes)

server.c:

#include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 
    #include <sys/socket.h> 
    #include <arpa/inet.h> //inet_aton(), inet_ntoa() etc 
    #include <sys/types.h> 
    #include <netinet/in.h> 

    #define PORT 8000 
    #define ERROR perror("Something went wrong! => "); 
    #define BUFFERSIZE 256 
    int main() 
    { 
     int sockfd, client_socketfd; 
     int bytes_sent; 
     socklen_t sin_size; 
     struct sockaddr_in server_addr; 
     struct sockaddr_in connectedClient_addr; 
     char message[BUFFERSIZE] = "Welcome to the server!"; 

     if((sockfd = socket(PF_INET, SOCK_STREAM ,0)) == -1) { 
      ERROR; 
      exit(-1); 
     } 

     server_addr.sin_family = AF_INET; 
     server_addr.sin_port = htons(PORT); 
     server_addr.sin_addr.s_addr = INADDR_ANY; //Subject to change 


     if((bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))) == -1) { 
      ERROR; 
      exit(-2); 
     } 


     if((listen(sockfd, 5)) == -1) { 
      ERROR; 
      exit(-3); 
     } 

     int addrlen = sizeof(connectedClient_addr); 
     if((client_socketfd = accept(sockfd, (struct sockaddr *)&connectedClient_addr, (socklen_t*)&addrlen)) == -1){ 
      ERROR; 
      exit(-4); 
     } 

     printf("Got a connection from: %s at port: %d" , inet_ntoa(connectedClient_addr.sin_addr), PORT); 

     if((send(sockfd, &message, BUFFERSIZE, 0)) == -1) { 
      ERROR; 
      exit(-5); 
     } 

     close(sockfd); 
     close(client_socketfd); 

     return 0; 
    } 

-

client.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 


#define PORT 8000 
#define ERROR perror("Something went wrong! =>"); 
#define BUFFERSIZE 256 
int main() 
{ 
    int sockfd; 
    struct sockaddr_in client_addr; 
    char message[BUFFERSIZE] = "Successfully connected!"; 
    int bytes_received, bytes_sent; 
    char buffer[BUFFERSIZE]; 


    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { 
     ERROR; 
     exit(-1); 
    } 


    client_addr.sin_family = AF_INET; 
    client_addr.sin_port = htons(PORT); 
    client_addr.sin_addr.s_addr = INADDR_ANY; 


    if((connect(sockfd, (struct sockaddr*)&client_addr, sizeof(client_addr))) == -1) { 
     ERROR; 
     exit(-2); 
    } 

    if((bytes_received = recv(sockfd, &buffer, BUFFERSIZE, 0)) == -1) { 
     ERROR; 
     exit(-3); 
    } 

    printf("Received %d bytes:\n" , bytes_received); 
    printf("%s", buffer); 

    close(sockfd); 

    return 0; 
} 
+2

Pour l'appel 'connect', vous devez spécifier une * adresse spécifique *. –

+1

Sur cette ligne, dans le code client: 'client_addr.sin_addr.s_addr = INADDR_ANY;', vous avez essayé de connecter le client à n'importe quelle adresse. Vous devez spécifier l'adresse IP que vous souhaitez connecter – HatsuPointerKun

+0

@HatsuPointerKun Merci, va essayer maintenant. – RamonSS

Répondre

0

RÉPONSE: Le problème était que j'ai fourni la socket serveur à l'intérieur de la fonction send() dans server.c au lieu du socket client. Par conséquent le code fonctionnait sans aucune erreur mais le comportement était incorrect. Crédit va à RemyLebeauin the comments qui a souligné cela et m'a sauvé d'innombrables heures de plus en difficulté.

+0

Le code ne pouvait probablement pas "fonctionner sans erreur". Vous devez avoir échoué à vérifier les erreurs sur la fonction 'send()'. Clairement soit ce n'était pas le vrai code ou vous n'avez pas signalé tous les symptômes. – EJP

+0

@EJP Je n'ai pas reçu d'avertissement ni de problème de compilateur. J'ai juste oublié de spécifier la bonne prise. Le programme fonctionnait correctement, comment je l'ai dit. Pas comment je voulais quand même. Si vous pensez que je devrais modifier la réponse finale, soumettez une demande d'édition et je serai heureux de l'accepter. – RamonSS