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 :

Fonction connect socket TCP/IP


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Fonction connect socket TCP/IP
    Bonjour,

    Je réalise un client de socket TCP/IP qui se connecte à des équipements placés sur réseau IP.

    Pour cela j'utilise la fonction "connect" de <sys/socket.h> sous Linux/GCC.

    Si l'équipement distant n'est pas sur le réseau, la fonction "connect" se bloque puis échoue en 15-17s.

    Comment faire pour réduire ce délais ? Pourquoi pas 1 s max.

    Merci pour votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Par défaut
    Salut,

    Je pense qu'une seconde n'est pas assez !

    Pour changer le timeout, faut utiliser ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    struct timeval montemps = {.tv_sec = 5; .tv_usec = 0};
    setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &montemps, sizeof(montemps));
    socket, c'est la socket que t'as créé
    .tv_sec, c'est le nombre de secondes du timeout
    .tv_usec, c'est le nombre de secondes du timeout (les deux sont additionnés)

    Bonne chance

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut
    Merci pour l'info, je vais tester.

    De part ton expérience, tu proposerais un temps de combien ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut
    A priori pas d'effet en ajoutant

    Voici le code de la fonction de connexion de la socket :
    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
     
    int MODBUSTCP_InitLiaisonServeur(char *AdresseIP, USHORT NumPort)
    {
    int IdSocket;
    USHORT TailleAdrSocketServeur;
    struct sockaddr_in AdrSocketServeur;
    struct timeval TimeOutConnexion;
    /* Timeout de connexion */
    TimeOutConnexion.tv_sec = 3;
    TimeOutConnexion.tv_usec = 0;
     
     
    /* Creation de la socket (options adaptees pour API) */
    if((IdSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    	{
    	DEBUG_Affichage("MODBUSTCP.c : Erreur creation de la socket");
    	return(-1);
    	}
     
    /* Adresse IP et numero de port */
    TailleAdrSocketServeur = sizeof(struct sockaddr_in);
    memset( &AdrSocketServeur, 0, TailleAdrSocketServeur );				/* Mise a 0 de toute la structure */
    AdrSocketServeur.sin_family = AF_INET;								/* Rempli la struct avec le type de protocole (TCP) */
    AdrSocketServeur.sin_port = htons(NumPort);							/* Rempli la struct avec le num du port du serveur */
    if (inet_aton(AdresseIP, &(AdrSocketServeur.sin_addr)) == 0)		/* Rempli la struct avec l'IP du serveur */
    	{
    	DEBUG_Affichage("MODBUSTCP.c : Erreur : mauvais format d'adresse IP");
    	return(-1);
    	}
     
    /* Pour fixer un timeout si pas de connexion */
    setsockopt(IdSocket, SOL_SOCKET, SO_RCVTIMEO, &TimeOutConnexion, sizeof(TimeOutConnexion));
     
    /* Connection a la socket */
    if(connect(IdSocket, (struct sockaddr *) &AdrSocketServeur, sizeof(struct sockaddr_in) ) < 0)
    	{
    	/* Fermeture de la socket */
    	DEBUG_Affichage("MODBUSTCP.c : Erreur lors de la connexion au serveur => fermeture de la socket");
    	close(IdSocket);
    	return(-1);
    	}
     
    return(IdSocket);
    }

  5. #5
    Membre actif
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Par défaut
    Salut,

    Je me suis trompé alors.

    Tu peux essayer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct timeval TimeOutConnexion;
    /* Timeout de connexion */
    TimeOutConnexion.tv_sec = 5;
    TimeOutConnexion.tv_usec = 0;
     
    /* Pour fixer un timeout si pas de connexion */
    setsockopt(IdSocket, SOL_SOCKET, SO_SNDTIMEO, &TimeOutConnexion, sizeof(TimeOutConnexion));
    3 secondes me semble peu mais tout dépend de l'éloignement de la machine distante et s'il s'agit d'un réseau interne.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut
    Ok, l'erreur de connect remonte plus vite mais le time out spécifié n'est pas respecté.

    C'est du coup presque instantané malgré TimeOutConnexion.tv_sec = 10;.

  7. #7
    Membre actif
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Par défaut
    C'est bizarre alors.

    Par contre, si le serveur répond avant, c'est normal que le timeout soit pas respecté ^^

    Le timeout ne s'applique que si ça met trop de temps; donc si ton serveur répond c'est bon ou erreur avant le timeout c'est normal.

    Vérifie les erreurs que ça retourne, je pense que ça retourne genre un serveur unavailable à la place

    J'ai traduit les différentes erreurs que ça peut te renvoyer:

    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
     
    [EADDRNOTAVAIL]
        L'adresse spécifiée n'est pas atteignable depuis la machine locale. 
    [EAFNOSUPPORT]
        L'adresse fournie est invalide car ne correspond pas au groupe de socket spécifié.
    [EALREADY]
        Une connection est déjà en cours pour la socket spécifiée.
    [EBADF]
        L'argument socket n'est pas un descripteur de fichier valide.
    [ECONNREFUSED]
        L'adresse distante n'écoutait pas les connnections ou a refusé la connection.
    [EFAULT]
        Le paramètre adresse ne peut être accédé. 
    [EINPROGRESS]
        O_NONBLOCK est activé pour le descripteur de fichier pour la socket, la connection ne peut être établie immédiatement; elle va être établie de manière asynchrone.
    [EINTR]
        La tentative d'établir une conntection a été interrompue par un signal capturé; la connection va être établie de manière asynchrone.
    [EISCONN]
        La socket spécifiée est en mode connection et déjà connectée.
    [ENETUNREACH]
         Pas de connection internet. 
    [ENOTSOCK]
        L'argument socket ne correpond pas à une socket.
    [EPROTOTYPE]
        L'adresse spécifiée a un trype différent que la limite de la socket vers le client spécifié.
    [ETIMEDOUT]
        La tentative de connection a été annulée du à un timeout.
    En espérant t'avoir aidé

Discussions similaires

  1. socket tcp non connecté
    Par coco673 dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 17/04/2013, 14h19
  2. Réponses: 14
    Dernier message: 07/06/2010, 12h36
  3. Réponses: 2
    Dernier message: 03/01/2010, 13h39
  4. Envoyer un TPoint par une connection Socket ????
    Par jeldorak dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2002, 19h41
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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