IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

problème avec la fonction recvfrom


Sujet :

Développement

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut problème avec la fonction recvfrom
    Bonjour,

    Merci pour le tuto! J'ai suivi les conseils et j'ai donc maintenant un serveur et un client sans erreur (qui compile sous codeblocks). J'utilise le mode non connecté.
    Cependant le code du serveur ne renvoie plus rien à partir de la ligne 36 (utilisation de la fonction recvfrom). Je pense que la fonction est mal utilisée !?

    J'ai qu'un PC pour tester. Je dois donc envoyer et recevoir sur l'adresse 127.0.0.1. Je pense avoir bien fait pour le client mais moins pour le serveur.

    Dernière question, comment faire pour utiliser le client et le serveur dans le même projet étant donné qu'ils utilisent chacun un main. Ne sachant pas répondre j'ai créer deux projets différents : client et serveur comme vous verrez ci-dessous.

    Merci d'avance,
    Cordialement,

    Client.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <winsock2.h>
    #include <stdio.h>
    
    int main()
    {
        WSADATA wsaData;
    
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
    
            s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN dest;
                char buffer[100] = "Bonjour\n";
                printf("coucou");
    
                dest.sin_family       = AF_INET;
                dest.sin_addr.s_addr  = inet_addr("127.0.0.1");
                dest.sin_port         = htons(5050);
                memset(&dest.sin_zero, '\0', sizeof(dest.sin_zero));
    
                sendto(s, buffer, (int)strlen(buffer), 0, (SOCKADDR *)&dest, sizeof(dest));
    
                closesocket(s);
            }
    
            WSACleanup();
        }
    
        return 0;
    }
    Serveur.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <stdio.h>
    #include <winsock2.h>
    
    int main()
    {
        WSADATA wsaData;
    
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
    
            s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN r; /* Le recepteur (nous) */
    
                r.sin_family       = AF_INET;
                r.sin_addr.s_addr  = htonl(INADDR_ANY);
                r.sin_port         = htons(5050);
                memset(&r.sin_zero, '\0', sizeof(r.sin_zero));
    
                if (bind(s, (SOCKADDR *)&r, sizeof(r)) == SOCKET_ERROR)
                    fprintf(stderr, "La fonction bind a echoue.\n");
                else
                {
    
                    SOCKADDR_IN e; /* L'expediteur (d'ou vient le message ...) */
                    int n, esize;
                    char buffer[100];
                    printf("coucou");
                    esize = sizeof(e);
                    n = recvfrom(s, buffer, sizeof(buffer) - 1, 0, (SOCKADDR *)&e, &esize);
                    printf("coucou"); /*celui ci ne s'affiche pas*/
                    if (n != SOCKET_ERROR)
                    {
                        buffer[n] = '\0';
                        printf("Un message de %s : %s", inet_ntoa(e.sin_addr), buffer);
                    }
                }
    
                closesocket(s);
            }
    
            WSACleanup();
        }
    
        return 0;
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par celiavaga Voir le message
    Dernière question, comment faire pour utiliser le client et le serveur dans le même projet étant donné qu'ils utilisent chacun un main. Ne sachant pas répondre j'ai créer deux projets différents : client et serveur comme vous verrez ci-dessous.
    Dans ce cas, j'utilise un paramètre (-s par exemple) dans la ligne de commande pour indiquer si le main() doit se comporter en serveur et pas de paramètre pour le mode client
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Dans ce cas, j'utilise un paramètre (-s par exemple) dans la ligne de commande pour indiquer si le main() doit se comporter en serveur et pas de paramètre pour le mode client
    Mais ici je n'ai pas de ligne de commande vu que je compile avec codeblocks ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par celiavaga Voir le message
    Mais ici je n'ai pas de ligne de commande vu que je compile avec codeblocks ?


    Je ne connais pas codeblock mais je suppose que tu dois pouvoir spécifier des paramètres à passer au programme lors du lancement dans ton environnement de développement. Il va falloir chercher un peu ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut plusieurs mains
    J'ai trouvé ça sur un autre forum, qu'en pensez-vous?

    "le plus simple est de faire un troisième programme 'test.c' qui sera juste chargé de lancer deux threads: un thread qui lance ton programme client, et l'autre qui lance ton programme serveur.

    Quand tu fais des modifs sur les sources tu n'as qu'à recompiler les 2 programmes et lancer ton programme test.
    Le truc c'est qu'avec cette solution tu ne peux pas faire de débogage de 2 programmes de bases.

    Si tu veux pouvoir déboguer, ton fichier 'test.c' doit inclure les sources de tes deux autres programmes et chaque thread doit s'occuper de réaliser la fonction main du programme (serveur ou client) qu'il doit exécuter. Dans ce cas (vu que tu inclues les sources de tes deux autres programmes dans le test.c) pour éviter de se retrouver avec 3 méthodes main, tu n'as qu'à encadrer les main des programmes clients et serveur par une directive #ifndef ... #endif."

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Au départ, tu avais un problème simple et légitime : regrouper 2 projets en un seul et gérer les 2 main() dupliqués

    Je te donne une solution simple, tu en trouves une autre qui de demande de créer un 3eme projet et de lancer 2 thread, 1 serveur et 1 client.

    Pour info, 2 thread partagent le même espace mémoire et donc tu risques des bugs dans lequel le client irait "butiner" dans le serveur et provoquer un crash du serveur alors que c'est le client qui est en cause. De plus, avec ma méthode, tu peux deboguer le client et le serveur simultanément.

    Tu ne crois pas que cela vaut un peut de recherche pour savoir comment passer un argument dans la ligne de commande ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Au départ, tu avais un problème simple et légitime : regrouper 2 projets en un seul et gérer les 2 main() dupliqués

    Je te donne une solution simple, tu en trouves une autre qui de demande de créer un 3eme projet et de lancer 2 thread, 1 serveur et 1 client.

    Pour info, 2 thread partagent le même espace mémoire et donc tu risques des bugs dans lequel le client irait "butiner" dans le serveur et provoquer un crash du serveur alors que c'est le client qui est en cause. De plus, avec ma méthode, tu peux deboguer le client et le serveur simultanément.

    Tu ne crois pas que cela vaut un peut de recherche pour savoir comment passer un argument dans la ligne de commande ?
    Oui oui. J'ai trouvé où est ce qu'il fallait aller pour ajouter un argument sur codeblocks. Je fais des recherches pour trouver quel argument rajouter mais je ne trouve pas! J'ai essayé -s sur le serveur ça n'a rien changé.

    Merci,

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    "-s" c'était un exemple
    il faut que ton programme gère et lise les paramètres passés en ligne de commande
    regarde la fonction getopt, il y a des exemples à la fin
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo