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

C Discussion :

encode utf8 socket udp


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut encode utf8 socket udp
    binjour,
    Je souhaite communiqué avec un variateur de la marque elmo, pour cela j'utilise l'udp. Les instruction a transmettre sont simple (ex= "MO=1\r" "MO=1\r" "JV=50000\r""BG\r")
    Il y a plusieurs mois j'avais écrit un programme en python qui communiqué avec en USB par contre, et sur les conseille d'une personne j'encodais ce message en utf-8 sinon ça ne fonctionnais pas ...
    morceau du code en python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ser.write("BG\r".encode('utf8'))   #Départ
    l'idée serais de faire pareil en C mais j'ai pas tout compris la dessus...voici un morceau de mon code (oui il a beaucoup d'include pas forcement utile mais c'est ceux de mon programme principale ,là c'est juste un espace de test)

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    // Pour sockets //
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1   // def de la valeur de defaut qu une fonction peut me renvoyer // pour la comparaison
    #define SOCKET_ERROR -1
    #define closesocket(s) close(s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    // Standard //
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>
    //Port de communication output //
    #define PORT 5001
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    #include <locale.h>
     
     
     
     
     
     
    int main()
    {
     
        SOCKET sock;   //nom de ma socket
        SOCKADDR_IN sin;  // adresse ip
        SOCKET csock;    
        SOCKADDR_IN csin;
        char buffer[20]; // taille du buffer dans lequel vas etre mes data
        socklen_t recsize = sizeof(csin);
        int sock_err;
        socklen_t fromlen = sizeof(sin);
     
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if(sock != INVALID_SOCKET)    // Configuration //
            {
                sin.sin_addr.s_addr = inet_addr("10.10.10.104");
               // sin.sin_addr.s_addr = htonl(INADDR_ANY);  
                sin.sin_family         = AF_INET;             // Protocole(TCP/IP)
                sin.sin_port           = htons(PORT);         // Listage du port    
                sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
     
                if (sock_err==SOCKET_ERROR){return 0;} 
                else{printf("La socket est maintenant ouverte en mode UDP \n");}
            }
     
     
       wchar_t *chaine = L"MO=1\n";
     
        setlocale(LC_CTYPE, "utf-8");
     
        wprintf(L"%ls", chaine);
     
     
          //  char utf8[] = u8"MO=1\n";
            //char * message=utf8;
            int sock_errsend=sendto(sock,chaine, sizeof(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
            printf("send= %d \n",sock_errsend);
     
     
                //Fermeture de la socket 
                printf("Fermeture de la socket...\n");
                closesocket(sock);
                printf("Fermeture du serveur terminee\n");
     
     
    }
    voici ce qu'il me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ gcc -o test test.c
    $ ./test
    La socket est maintenant ouverte en mode UDP 
    send= 8 
    Fermeture de la socket...
    Fermeture du serveur terminee
    quand je change mes paramètres ip ou port ma socket ne ce connecte pas ,donc la socket fonctionne!

    si vous avez une idée du problème ou des pistes je suis preneur !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leoleo34 Voir le message
    binjour,
    Oui, binjour aussi
    Citation Envoyé par leoleo34 Voir le message
    si vous avez une idée du problème ou des pistes je suis preneur !
    Ben déjà immédiatement en ligne 70 le sizeof(chaine) ça ne le fait pas du tout. sizeof est ultra trivial. Tu lui demandes la taille d'un truc, il te donne la taille de ce truc. Or, la taille d'un pointeur c'est 4 sur un os 32 bits et 8 sur un os 64 bits. En aucun cas ça ne te donne la taille de la chaine car en C une chaine ce n'est qu'une adresse. Ici strlen() sera plus adapté.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    le strlen() ne fonctionne pas: voici l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    test.c: In function ‘main’:
    test.c:69:53: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [-Wincompatible-pointer-types]
             int sock_errsend=sendto(sock,chaine, strlen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
                                                         ^~~~~~
    In file included from test.c:16:0:
    /usr/include/string.h:384:15: note: expected ‘const char *’ but argument is of type ‘wchar_t * {aka int *}extern size_t strlen (const char *__s)
                   ^~~~~~

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int sock_errsend=sendto(sock,chaine, strlen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
    j ai essayer avec strlen(*chaine) ou strlen(* chaine) mais pareil..

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Il est pourtant écrit noir sur blanc que strlen attend un char* et que tu utilises un wchar_t*.
    Après est-ce pertinent d'utiliser UDP dans ce cas ? Avec les pertes inhérentes au protocole.. bof.
    Est-ce probant d'utiliser de l'utf8 pour des chaînes ASCII ? J'en doute.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    dans tout les cas pour le strlen() je peut mettre une valeur fixe ex=300 , et j'utilise de l'udp car mon variateur fonctionne avec de l'udp
    et je suis d'accord avec toi mais sans être en utf8 il ne reconnais pas mes instruction ....

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ou en 1/100s sur Google http://man7.org/linux/man-pages/man3/wcslen.3.html http://www.cplusplus.com/reference/cwchar/wcslen/
    Il est possible que le variateur traite les données reçues comme wchar_t*, c'est juste étrange.
    Par contre, l'UDP ? C'est obligatoire sur leur documentation ? Et le bind devrait utiliser ANY et non une ip spécifique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    merci,
    et ducoup la "fonction" wchar_t* permet l'encodage c'est bien ça et je ne comprend pas comment il sais que je veut encodé en utf8 ou autre chose..
    et oui UDP le support technique me la spécifie, et tout mes systèmes sont en UDP (Robot fanuc(en acquisition) et ce variateur) donc à terme je vais utiliser un select pour gérer les deux.

    et pour le bind l'ip fonctionne comme ça aussi mais je vais passer en anny ça m’évitera de re-fixer mon ip a chaque redémarrage pour être en accord avec mon programme (si j'ai bien compris)

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    wchar_t ça n'est pas une fonction c'est un type de stockage de caractère qui peut stocker l'ensembles des graphies mondiales donc plus de 100000 caractères différents. utf-8 est un moyen de transmettre ces caractères différents. On peut donc utiliser des fonctions de conversion d'une chaîne de wchar_t en une chaîne d'utf-8, et ça n'a rien à voir avec la locale.
    On peut aussi voir que les caractères transmis sont les caractères de base (il y en a que 96 = les lettres les chiffres et quelques symboles), et là plus besoin de conversion en écrivant simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const wchar_t *chaine = L"MO=1\r"; // c'est directement compatible avec ce qui est attendu.
    int sock_errsend=sendto(sock,chaine, wcslen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
    Et ne pas confondre \n qui est le line feed avec \r qui est le carriage return.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int sock_errsend=sendto(sock,chaine, strlen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
    Perso je conseillerais strlen(chaine) + 1 pour que le '\0' soit lui-aussi transmis. Ce n'est pas obligatoire de le faire mais sinon il faut alors que le destinataire pense à le mettre manuellement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char *chaine = L"MO=1\r"; // c'est directement compatible avec ce qui est attendu.
    int sock_errsend=sendto(sock,chaine, strlen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
    Et ne pas confondre \n qui est le line feed avec \r qui est le carriage return.
    Déso pour l’absence j’étais sur autre choses!

    du-coup j'ai suivit vos conseils, et toujours une erreur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test1.c: In function ‘main’:
    test1.c:60:22: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
     const char *chaine = L"MO=1\r"; // c'est directement compatible avec ce qui est attendu.

    de plus je pense que mon probleme viens que j'arrive pas a envoyer le message sur l'adresse de mon var , car tout les tuto / code qu on trouve sont fait pour fonctionner en serveur/client et au final ils ce connecte car le client envoie une acceptation (donc sont ip) au serveur,je pense que j'ai rater quelque chose a ce niveau là,, en gros il me vaudrais un send avec en argument direct l ip visé ou le port

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le préfixe L indique une chaîne de wchar_t. strlen est pour char*, pour wchar_t il faut utiliser wcslen.
    Tu es libre de créer ta propre fonction.
    Tu as tout ce qu'il te faut disponible ici https://bousk.developpez.com/cours/r...iers-pas/#LV-A
    Tu n'as aucune connexion à établir en UDP.
    Mais tu ne veux certainement pas recréer un socket à chaque fois.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    ok ok ,
    donc là actuellement j'ai ça qui envoi bien mon message mais aucune action sur mon variateur


    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    // Pour sockets //
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1   // def de la valeur de defaut qu une fonction peut me renvoyer // pour la comparaison
    #define SOCKET_ERROR -1
    #define closesocket(s) close(s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    // Standard //
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>
    //Port de communication output //
    #define PORT 5001
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    #include <locale.h>
     
    int main()
    {
     
        SOCKET sock;   //nom de ma socket
        SOCKADDR_IN sin;  // adresse ip
      //  SOCKET csock;    
      //  SOCKADDR_IN csin;
        char buffer[350]; // taille du buffer dans lequel vas etre mes data
        socklen_t recsize = sizeof(sin);
        int sock_err;
        socklen_t fromlen = sizeof(sin);
     
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if(sock != INVALID_SOCKET)    // Configuration //
            {
               // sin.sin_addr.s_addr = inet_addr("192.168.1.4");
                sin.sin_addr.s_addr = INADDR_ANY;  
                sin.sin_family         = AF_INET;             // Protocole(TCP/IP)
                sin.sin_port           = htons(PORT);         // Listage du port    
                sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
     
                if (sock_err==SOCKET_ERROR){printf("La socket PAS ouverte en mode UDP \n");return 0;} 
                else{printf("La socket est maintenant ouverte en mode UDP \n");}
            }
     
        SOCKADDR_IN dst;
    	inet_pton(AF_INET, "192.168.1.2", &dst.sin_addr.s_addr);
    	dst.sin_family = AF_INET;
    	dst.sin_port = htons(PORT);
     
        const wchar_t *chaine = L"MO=1\r"; // c'est directement compatible avec ce qui est attendu.
        int sock_errsend=sendto(sock,chaine, wcslen(chaine), 0, (SOCKADDR *)&sin, sizeof(sin));
            printf("send= %d \n",sock_errsend);
     
     
                //Fermeture de la socket 
                printf("Fermeture de la socket...\n");
                closesocket(sock);
                printf("Fermeture du serveur terminee\n");
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    La socket est maintenant ouverte en mode UDP 
    send= 5 
    Fermeture de la socket...
    Fermeture du serveur terminee
    alors que en python et serial port j'ai ça qui fonctionne parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Mon May 11 11:27:12 2020
     
    @author: xxxxxxxxxx
    """
     
    from serial import Serial   #dialogue avec variateur
    ser = Serial('/dev/ttyACM0',9600)
    MO="MO=0\r"
    ser.write(MO.encode('utf8'))    #Moteur actif
    pour moi le probleme viens uniquement de l'encodage

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    T'es tellement focalisé sur une erreur d'encodage pour je ne sais quelle raison que tu ne vois même pas que tu envoies ton truc à toi-même et non à ton variateur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    je crois je viens de voir mon erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const wchar_t *chaine = L"MO=1\r"; // c'est directement compatible avec ce qui est attendu.
        int sock_errsend=sendto(sock,chaine, wcslen(chaine), 0, (SOCKADDR *)&dst, sizeof(dst));
    mais toujours pareil, y'a t il une autre erreur ?(ça fait pas longtemps que je programme et encore moins des sockets )

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ton script Python utilise une lib de Serial qui fait sûrement tout un tas de trucs.
    Comment tu choisis sur quel port envoyer pour ton socket ? 5001 sort d'où ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    je vais regardé de plus prés cette lib , et le 5001 est celui que j'ai configuré dans mon variateur

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    déjà es que mon programme est correct pour la gestion des sockets? j'envoie bien mon message sur le port 5001 sur l'ip 192.168.1.2?

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    // Pour sockets //
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1 // def de la valeur de defaut qu une fonction peut me renvoyer // pour la comparaison
    #define SOCKET_ERROR -1
    #define closesocket(s) close(s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    // Standard //
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>
    //Port de communication output //
    #define PORT 5001
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    #include <locale.h>
     
     
    int main()
    {
     
        SOCKET sock;      //nom de ma socket
        SOCKADDR_IN sin;  // adresse ip
                          //  SOCKET csock;
                          //  SOCKADDR_IN csin;
        char buffer[350]; // taille du buffer dans lequel vas etre mes data
        socklen_t recsize = sizeof(sin);
        int sock_err;
        socklen_t fromlen = sizeof(sin);
     
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (sock != INVALID_SOCKET) // Configuration //     // ma machine
        {
            // sin.sin_addr.s_addr = inet_addr("192.168.1.4");
            sin.sin_addr.s_addr = INADDR_ANY;
            sin.sin_family = AF_INET;   // Protocole(TCP/IP)
            sin.sin_port = htons(PORT); // Listage du port
            sock_err = bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
            if (sock_err == SOCKET_ERROR)
            {
                printf("La socket PAS ouverte en mode UDP \n");
                return 0;
            }
            else
            {
                printf("La socket est maintenant ouverte en mode UDP \n");
            }
        }
     
        SOCKADDR_IN dst;    // mon variateur
        inet_pton(AF_INET, "192.168.1.2", &dst.sin_addr.s_addr);
        //sin.sin_addr.s_addr = INADDR_ANY;
        dst.sin_family = AF_INET;
        dst.sin_port = htons(PORT);
     
        const wchar_t *chaine = L"MO=1\n"; // c'est directement compatible avec ce qui est attendu.
        int sock_errsend = sendto(sock, chaine, wcslen(chaine)+1, 0, (SOCKADDR *)&dst, sizeof(dst));
        printf("send= %d \n", sock_errsend);
     
        //Fermeture de la socket
        printf("Fermeture de la socket...\n");
        closesocket(sock);
        printf("Fermeture du serveur terminée\n");
    }

Discussions similaires

  1. Pb de socket udp
    Par phoenixia dans le forum MFC
    Réponses: 7
    Dernier message: 01/06/2006, 17h08
  2. [socket UDP] Codage BER : Format des Tag (TLG)
    Par Lolita59 dans le forum Réseau
    Réponses: 28
    Dernier message: 19/05/2006, 17h37
  3. Socket : UDP ou TCP
    Par lafracas dans le forum Développement
    Réponses: 2
    Dernier message: 10/04/2006, 22h43
  4. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  5. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19

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