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 :

[Socket] timout sur connect()


Sujet :

C++

  1. #1
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut [Socket] timout sur connect()
    Bonjour,

    Je souhaiterais pouvoir ajouter un timout sur le connect de ma socket. J'ai déjà un timout effectif pour l'envoie mais malgré plusieurs essaie et des recherches sur internet impossible de trouver une solution.

    Voici le bout de code de la fonction que j'utilise :
    Code c++ : 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
    SOCKET sock; //Cr�ation de la socket
    SOCKADDR_IN sin;
    int size = 10;
    char *buffer;
    buffer = (char*) malloc(sizeof(char*) * size);
    memset(buffer, 0, size);
    fd_set readfs;
    struct timeval tv;
     
    sin.sin_addr.s_addr = inet_addr(ip);
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(502);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
     
    if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
        return "-1";
     
    int ret = 0;
    FD_ZERO(&readfs);
    FD_SET(sock, &readfs);
    tv.tv_sec = 5;
    tv.tv_usec = 0;
     
    buffer[0] = 0x00; //Transaction ID
    buffer[1] = 0x01; //Transactio6n ID
    buffer[2] = 0x00; //Protocole ID
    buffer[3] = 0x00; //Protocole ID
    buffer[4] = 0x00; //Length
    buffer[5] = 0x04; //Length
    buffer[6] = numEsclave; //Num�ro d'esclave
    buffer[7] = 0x11; //Num�ro de la fonction
    //Envoie de la socket
    int a = send(sock, //La socket � envoyer
                        buffer, //La requete � envoyer
                        size, //La taille de la requete
                        0);
    if(a < 0)
        return "-1";

    Le but serais donc de gérer un timeout d'environ 5 secondes sur la fonction connect se trouvant ligne 17 et qu'en cas de timeout cela retourne -1.
    Est-ce que quelqu'un pourrait me donner une piste pour gérer un timeout sur une fonction connect ?
    Je vous remercie d'avance

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    t'as essayé setsockopt() ??? tu as SND_TIMEO et RCV_TIMEO qui contrôlent le time out sur un send ou un recv, c'est pas impossible que ça gère aussi celui du connect. à essayer.

    sinon rien à voir : fais gaffe à l'allocation de ton buffer : (char*) malloc(sizeof(char*) * size);
    là tu alloues 4 fois la taille "size", je ne sais pas si ce que tu voulais vraiment faire.

    mmm ... TransactionID, numEsclave, .... serait-ce du modbus ????

  3. #3
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Super avec setsockopt() ça marche nikel. J'ai juste un peu modifier mon code pour pouvoir réutiliser le même timer que pour mon select : (le passage intéressant est ligne 23 )

    Code c++ : 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
    SOCKET sock; //Création de la socket
    SOCKADDR_IN sin;
    int size = 10;
    char buffer[size];
    memset(buffer, 0, size);
    fd_set readfs;
    struct timeval tv;
     
    sin.sin_addr.s_addr = inet_addr(ip);
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(502);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
     
    int ret = 0;
    FD_ZERO(&readfs);
    FD_SET(sock, &readfs);
    tv.tv_sec = 5;
    tv.tv_usec = 0;
     
    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(tv));
    if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
        return "-1";
     
    buffer[0] = 0x00; //Transaction ID
    buffer[1] = 0x01; //Transactio6n ID
    buffer[2] = 0x00; //Protocole ID
    buffer[3] = 0x00; //Protocole ID
    buffer[4] = 0x00; //Length
    buffer[5] = 0x04; //Length
    buffer[6] = numEsclave; //Numéro d'esclave
    buffer[7] = 0x11; //Numéro de la fonction
    // Pas de CRC 16 dans ce mode de contact !
    //Envoie de la socket
    int a = send(sock, //La socket à envoyer
             buffer, //La requete à envoyer
             size, //La taille de la requete
             0);
    if(a < 0)
        return "-1";

    Citation Envoyé par phi1981
    sinon rien à voir : fais gaffe à l'allocation de ton buffer : (char*) malloc(sizeof(char*) * size);
    là tu alloues 4 fois la taille "size", je ne sais pas si ce que tu voulais vraiment faire.
    Effectivement merci je devais être très fatigué ce jour la, en plus il existe plus simple char buffer[size];
    Citation Envoyé par phi1981
    mmm ... TransactionID, numEsclave, .... serait-ce du modbus ????
    Quel oeil de lynx !
    C'est effectivement du modbus, j'utilise dans le reste du programme la bibliothèque libmodbus mais c'est ici une fonction spécifique au constructeur que j'utilise et elle n'est donc pas implémenté dans la biblio.

    Merci beaucoup pour le coup de main

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut
    Bonjour

    Désolé pour la question que je vais poser mais je ne suis vraiment pas alaise avec le C/C++..

    Citation Envoyé par humitake Voir le message
    C'est effectivement du modbus, j'utilise dans le reste du programme la bibliothèque libmodbus mais c'est ici une fonction spécifique au constructeur que j'utilise et elle n'est donc pas implémenté dans la biblio.
    Pour la blibliothèque Libmodbus, c'est une bibliothèque en C principalement porté sur linux.. Je vois que ton code est du C++ et je me demande comment tu as utilisé cette librairie ? On peut directement utiliser une librairie en C dans du code C++ ? ou bien il faut développer un wrapper ?

    Cordialement,

    NazOok.

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Le C++ est fait de manière à être compatible avec le C : tu peux compiler du code C avec un compilateur C++ (la réciproque n'est pas vraie).
    Tu peux donc utiliser sans soucis une bibliothèque écrite en C dans du code C++, c'est même très courant en fait. (il suffit de considérer qu'OpenGL est une lib C)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Le C++ est fait de manière à être compatible avec le C : tu peux compiler du code C avec un compilateur C++ (la réciproque n'est pas vraie).
    Tu peux donc utiliser sans soucis une bibliothèque écrite en C dans du code C++, c'est même très courant en fait. (il suffit de considérer qu'OpenGL est une lib C)
    Oui en effet c'est ce que j'ai appris dans mes dernières recherches tout à l'heure
    Maintenant reste plus qu'à réussir à compiler la bibliothèque de libmodbus, je galèreeeeeeeeee ^_^

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

Discussions similaires

  1. [Proxy][Socket] Etablir une connection au travers d'un proxy
    Par groskek dans le forum Développement
    Réponses: 1
    Dernier message: 03/03/2006, 20h01
  2. Réponses: 2
    Dernier message: 07/01/2006, 12h33
  3. [socket] Probleme avec connect
    Par sorry60 dans le forum Réseau
    Réponses: 12
    Dernier message: 16/11/2005, 22h01
  4. [SOCKET] Client C connecté à un serveur Java
    Par missllyss dans le forum Développement
    Réponses: 2
    Dernier message: 07/06/2004, 13h14
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

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