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 :

Lecture d'une Socket sous Linux


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut Lecture d'une Socket sous Linux
    bonjour à tous/es,
    je viens de m'inscrire sur ce forum et débutant en informatique !
    Pour un projet je doit récupérer des trames d'information en UDP, on trouve pas mal de choses un peut partout sur le net.
    J' ai donc écrit ce programme sensé récupérer les trames envoyer par ma machines distante :

    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
     
    #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;
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define PORT 6008
     
     
    int main(void)
    {
        SOCKET sock;   //nom de ma socket
        SOCKADDR_IN sin;  // adresse ip
        SOCKET csock;    
        SOCKADDR_IN csin;
        char buffer[360] = "";
        socklen_t recsize = sizeof(csin);
        int sock_err;
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     
     
            if(sock != INVALID_SOCKET)
            {
                printf("La socket %d est maintenant ouverte en mode UDP \n", sock);
     
                // Configuration 
                //sin.sin_addr.s_addr = htonl(INADDR_ANY);  
                sin.sin_addr.s_addr = inet_addr("192.168.1.4");
                sin.sin_family         = AF_INET;             // Protocole(TCP/IP)
                sin.sin_port           = htons(PORT);         // Listage du port 
     
                sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
                printf("Etat bind %d \n",sock_err);
     
     
                // Si la socket fonctionne
                if(sock_err != SOCKET_ERROR)
                {
                    printf("je suis la \n");
                    int nb_octet = recv(sock, buffer,sizeof(buffer)-1, 0);
                    printf("Recu2 : %s\n", buffer);
     
     
                    printf ("%d octets reçus de %s\n", nb_octet,inet_ntoa(sin.sin_addr));
                    for (int i=0;i<nb_octet;i++)
                    {
                        printf ("%c",buffer[i]);
                    }
                }
     
     
                /* Fermeture de la socket */
                printf("Fermeture de la socket...\n");
                closesocket(sock);
                printf("Fermeture du serveur terminee\n");
            }
     
     
    }
    Mais quand j’exécute ce programme celui-ci rester bloqué sur le recv , je pense alors que ma machine n'envoie pas de caractère de fin de trames correspondant a la méthode Socket ou que mon buffer est mal configuré.
    Ma machine distante envoie des trames toutes les 4ms non stop et je ne peut pas modifier la syntaxe émise, voici ça forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ø´j´vâàäD®üEr©zÀ¨À¨zÏx^Ǻ<Rob Type="FANUC"><M_X>1301.135</M_X><M_Y>565.989</M_Y><M_Z>670.154</M_Z><M_W>-173.529938</M_W><M_P>89.417473</M_P><M_R>-173.051483</M_R><F_X>1301.160</F_X><F_Y>565.990</F_Y><F_Z>670.114</F_Z><F_W>-173.575760</F_W><F_P>89.415497</F_P><F_R>-173.097275</F_R><IPOStat>0</IPOStat><BMode>2</BMode><TRG>0</TRG><myRob>1</myRob><IPOC>64</IPOC></Rob>
    Merci !

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    pourquoi bind une adresse spécifique et non any ? T'es sûr de ton adresse ?
    Si tu es en UDP tu devrais utiliser recvfrom et non recv.
    recv est bloquant par défaut, si ça bloque c'est qu'il n'y a rien à recevoir.

    Tout ton code est du C, fais-tu vraiment du C++ ou tu t'es trompé de forum ?

    Pour plus d'informations, tu trouveras un cours dans ma signature que je t'invite à lire.
    https://bousk.developpez.com/cours/r...iers-pas/#LV-D
    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.

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

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    j'utilise une adresse spécifique car par la suite je vais devoir envoyer de l'UDP mais dans un autre système avec une adresse différente donc ça me paraissais logique, et c'est sur cette adresse et ce port que ma machine envoi mes trames
    Ok j'essaie de ce pas!
    et je me suis surement trompé oui !
    et oui j'ai suivit ce tuto ainsi que lui : http://sdz.tdct.org/sdz/les-sockets.html

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

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    voici ma modif mais toujours rien...

    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
     // Si la socket fonctionne
                if(sock_err != SOCKET_ERROR)
                {
     
                    socklen_t fromlen = sizeof(sin);
                    printf("je suis la \n");
                    int nb_octet = recvfrom(sock, buffer, 1500, 0, (SOCKADDR*)&sin, &fromlen);
                    printf("Recu2 : %s\n", buffer);
     
     
                    printf ("%d octets reçus de %s\n", nb_octet,inet_ntoa(sin.sin_addr));
                    for (int i=0;i<nb_octet;i++)
                    {
                        printf ("%c",buffer[i]);
                    }
                    printf ("\n");
                }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] lancer / kill une application sous linux
    Par Antoine NSG dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 16h06
  2. pb affichage d'une page sous linux
    Par fessebleu dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2005, 14h05
  3. Réponses: 14
    Dernier message: 09/08/2004, 13h42
  4. Taille d'une console sous linux
    Par Shinjuku dans le forum C
    Réponses: 7
    Dernier message: 13/06/2003, 12h44
  5. Affichage d'une image sous linux
    Par Braim dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 25/03/2003, 10h41

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