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

Réseau C Discussion :

[Client UDP] gestion port


Sujet :

Réseau C

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut [Client UDP] gestion port
    Bonjour,

    J'utilise une archi client/serveur UDP au travers une connexion ppp gprs.
    Serveur: @/port publique, ex: 10.11.12.13:999
    Client: NA

    2 Questions:
    - Si je bind ma socket cliente sur un port X, est ce que le serveur verra les paquets en provenance du port X ? (pour l'instant j'ai l'impression que non)

    - Ma connexion PPP est validée en me retournant une IP, pourtant mon serveur ne voit pas mon client au travers de cette dernière, est ce normal ?

    Mon probleme est que mon serveur voit mon client sur un port X (sur lequel il lui repond). Par contre par moment ce port change, alors que du coté client, la socket n'a pas été détruite. La seule chose qui change, c'est une déconnexion/reconnexion PPP.

    Je suis en train de me dire que ma socket cliente tape sur mon port local X, et que la connexion PPP réaffecte ce port X à un autre, qui lui, change si le PPP change aussi.

    Bref cette notion de port UDP est assez floue, je vais voir s'il n'y a pas de méthode systeme pour recuperer coté client le port utilisé par la socket cliente afin de voir s'il change coté client.

    Merci pour vos précisons, je pèche un peu sur ces notions réseaux..

  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 : 62
    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
    Par défaut
    Citation Envoyé par sone47 Voir le message
    - Si je bind ma socket cliente sur un port X, est ce que le serveur verra les paquets en provenance du port X ? (pour l'instant j'ai l'impression que non)
    Normalement oui

    On peut voir le code côté client et côté serveur (ou au moins le code qui concerne les sockets)
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Le code est au plus simple:

    Creation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mSock = socket(AF_INET,SOCK_DGRAM,0);
    Envoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       size = sizeof(sockaddrin);
       sockaddrin.sin_family = AF_INET;
       sockaddrin.sin_port = htons(mPort);
     
       sockaddrin.sin_addr.s_addr = (Ip[3] << 24) |
                                    (Ip[2] << 16) |
                                    (Ip[1] << 8 ) |
                                    (Ip[0]);
       memset(sockaddrin.sin_zero,0,8);
       sendto((SOCKET)mSock,buff,(int)nbytes,0,(struct sockaddr*)&sockaddrin,sizeof(sockaddrin));
    Par contre j'essaye la de récupérer le port de connexion cote client via un getsockname mais la structure renvoyée est toujours a 0...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       struct sockaddr_in sockaddrin;  
       int size = sizeof(sockaddrin);
     
       if (getsockname((SOCKET)mSock,(struct sockaddr*)&sockaddrin,&size))
       {
             Family    = sockaddrin.sin_family;
             Port      = ntohs(sockaddrin.sin_port);  
             Ipaddr[0] = sockaddrin.sin_addr.S_un.S_un_b.s_b1;
             Ipaddr[1] = sockaddrin.sin_addr.S_un.S_un_b.s_b2;
             Ipaddr[2] = sockaddrin.sin_addr.S_un.S_un_b.s_b3;
             Ipaddr[3] = sockaddrin.sin_addr.S_un.S_un_b.s_b4;   
       }
    Pour mon probleme de changement d'IP/Port que voit le serveur alors que coté client rien n'a changé (a par la passerelle):
    Si j'utilise une box adsl et ouvre ma socket client UDP pour taper sur mon serveur. Que se passe t il si jamais je reset la box? Coté socket client rien ne sera vu puisqu'on est justement en mode déconnecté, je me trompe ? par contre le serveur verra un changement d'IP et port. Est ce exact?

    [EDIT]
    Si on execute un sendto alors que la communication PPP n'est plus effective, est ce que le sendto renverra une erreur ?

    Merci d'avance

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Après avoir fait quelque test:

    Client:
    - Ouverture connexion PPP ok, on récupère une IP IP1
    - Création socket UDP et sendto vers serveurs sur IPServ/PortServ
    - IP/Port client impossible à récupérer via getsockname (tout est à 0)

    Serveur:
    - Écoute sur IPServ/PortServ
    - Réception message Client: mais IPclient != IP1 (=IP2) et port=PortClient1

    1- On coupe la communication PPP coté client
    2- Les envois via sendto sont effectifs mais plus acquittés car le serveur ne reçoit plus rien
    3- On relance PPP
    4- Les envois sont effectifs et le serveur reçoit les messages avec IPClient=IP2 et port différent (le service réattribue peut être la même IP vu le faible espace temps).

    J'en déduis:
    1- L'adresse/port client que voit le serveur dépend de ma comm PPP (change si ma comm PPP se reset).
    2- Qu'en UDP, un sendto vérifie uniquement que ses paquets à envoyer sont bien sortis de notre interface réseau.

    Par contre, on créé un client UDP puis effectuons des sendto. J'imagine qu'un bind implicite est effectué; par contre à quel moment (create/sendto)?
    J'essaye de trouver des infos, mais vu qu'un bind client UDP est peu courant, il n'y en a pas beaucoup dessus..
    J'imagine que si on effectue plusieurs sendto, le serveur nous verra avec la même IP/Port (ou non ?), donc a quel moment le système jugera ce port comme ré-affectable, a la destruction?

    Merci d'avance

Discussions similaires

  1. [SOCKET] Client UDP sur système Unix
    Par be_tnt dans le forum Développement
    Réponses: 1
    Dernier message: 14/04/2006, 21h31
  2. erreur Client UDP
    Par innosang dans le forum Réseau
    Réponses: 6
    Dernier message: 04/01/2006, 09h33
  3. Serveur/Client UDP: comment envoyer un fichier avec mon code
    Par danje dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/12/2005, 14h54
  4. gestion port RS232
    Par portos.lio dans le forum C
    Réponses: 8
    Dernier message: 30/11/2005, 12h04
  5. [Socket] Client UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 12
    Dernier message: 22/11/2005, 12h59

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