Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/11/2017, à 21:16

DoudouH

Socket qui ne transmet rien...

Bonsoir!
Je suis en train de faire un programme client serveur mais ça ne marche pas... J'ai pas mal avancé sur le programme, la création de socket marche, la connection s'effectue sans problème mais quand vient la transmission rien ne marche...
En fin en vrai, ça fonctionne, ma fonction recv() renvoie un message de longueur 0 ce qui signifie, je crois, que la connection a été coupée...
Si l'un d'entre vous y voit plus clair?
Voila le code : Server :

int main(int argc , char *argv[]) {
    int socket_desc, client_sock;
    struct sockaddr_in server, client;  //definition des identifiant client serveur
    char client_message[2000];  //Message client

    //Definition de la structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(789);


    //Creation de la socket
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);

    if (socket_desc == -1) {
        printf("Erreur socket :\n");
        return -1;
    }
    printf("Socket cree\n");

    //Bind
    if (bind(socket_desc, (struct sockaddr *) &server, sizeof(server)) < 0) {
        //print the error message
        perror("Erreur bind :\n");
        return -1;
    }
    printf("Bind effectue \n");

    //Ecoute connection entrante

    listen(socket_desc, 5);

    //accept connection from an incoming client
    while (1) {
        printf("J'attend pour un client...\n");

        client_sock = accept(socket_desc, (struct sockaddr *) &client,
                             (socklen_t *) &client); //acceptation de la connexion entrante

        if (client_sock < 0) {
            perror("Echec accept : \n");
            close(client_sock);
            close(socket_desc);
            return -1;
        }

        switch (fork()) {
            case -1:
                perror("Duplication ratée");
            case 0:
                close(socket_desc);  //Fermeture socket parent
                recv(client_sock, client_message, strlen(client_message), 0); //Reception message entrant
                printf("Message %s recu de %s sur port %d \n", client_message, inet_ntoa(client.sin_addr),
                       ntohs(client.sin_port));
                printf("Message longueur: %d", (int) strlen(client_message));
                send(client_sock, "Requete bien traitée", 20, 0);
                close(client_sock);
                exit(0);
            default:
                close(client_sock);
        }
    }
}

Client :

int main(int argc , char *argv[])
{
    int sock;
    struct sockaddr_in server;
    char message[1000] , server_reply[2000];

    server.sin_addr.s_addr = inet_addr("192.168.42.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 789 );

    //Creation de la socket

    sock = socket(AF_INET , SOCK_STREAM , 0);

    if (sock == -1)
    {
        printf("Could not create socket\n");
    }

    printf("Socket created\n");

    //Connection au serveur

    if (connect(sock , (struct sockaddr *) &server , sizeof(server)) < 0)
    {
        perror("connect failed.\n");
        return -1;
    }

    printf("Connected\n");

    //Rester connecté
    while(1)
    {
        printf("Enter message : ");
        scanf("%s" , message);

        //Envoie du message
        if( send(sock , message , strlen(message) , 0) < 0)
        {
            perror("Send failed\n");
            close(sock);
            return -1;
        }
        printf("message : %s sended", message);

        //Reception du message
        if(recv(sock , server_reply, 2000 , 0) < 0)
        {
            perror("recv failed\n");
            close(sock);
            return -1;
        }

        printf("Serveur repond :");
        printf("%s \n",server_reply);
    }
}

A noter peut être aussi, les messages envoyés du client au serveur son vide alors que l'inverse marche très bien.

Hors ligne

#2 Le 04/11/2017, à 18:04

Bigcake

Re : Socket qui ne transmet rien...

Bonjour,

Je vois plusieurs problèmes avec ton code coté serveur:
- L'utilisation de fork() pour traiter chaque connexion de client est extrêmement lourde par rapport à la création d'un thread avec pthread_create(), et t’amènera surement d'autres problèmes plus tard si tu veux faire des choses complexes.
  fork créé un tout nouveau processus système qui est une copie mémoire du père, je ne suis pas sur qu'un file-descriptor ouvert dans le père soit totalement valide dans le fils (j'avoue ne jamais avoir testé ce que tu est en train de faire)
- Tu ne vérifie pas les valeurs de retour de recv() et send() qui peuvent potentiellement te dire que le socket utilisé est invalide
- Au lieu de tout faire en même temps, procède par étapes, ça t'évitera de nombreux problèmes :
    - D'abord, fait fonctionner une communication simple entre ton serveur et client (pas de fork, pas de thread, tout lineaire)
    - Un fois que ça fonctionne, tu pourra penser à faire traiter ton client par un autre processus/thread

L'utilisation de select() pour détecter les éventuelles modifications sur socket sans rester indéfiniment bloqué dans recv(), est extrêmement pratique.
Pour ce genre de traitement (socket serveur/client), je te conseil d'utiliser plutôt des threads, qui est bcp plus léger, et bien plus pratique pour faire interagir tes différents clients (si c'est un futur besoin)

Dernière modification par Bigcake (Le 04/11/2017, à 20:15)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne