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

Bibliothèques Discussion :

winsock2 et routeur


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut winsock2 et routeur
    Voilà, pour apprendre le C/C++, je me suis lancé dans l'écriture d'un "chat" ressemblant à irc.

    J'utilise winsock2 et le système multi thread (DWORD WINAPI) comme il nous est présenté dans le tuto: http://khayyam.developpez.com/articl.../multithreads/

    La communication serveur/client marche très bien en local, mais ne fonctionne pas en externe.

    Je m'explique, je suis derrière un routeur qui redirige le port 80 sur la machine qui heberge le serveur et le client.

    Le serveur se bind correctement sur le port 80 et écoute sur toute les adresses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ServerAddr.sin_family = AF_INET;
     ServerAddr.sin_port = htons(80);
     ServerAddr.sin_addr.s_addr = INADDR_ANY;
    En donnant au client mon adresse externe et le port 80, le serveur detecte sa connection 30 secondes après la connection, mais le client ne recoit jamais rien et le serveur "l'éjecte" au niveau de ma boucle while (située dans le thread client) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(clients[id].active && recv(clients[id].soc, msg, PACKET_SIZE, 0) != -1) {
    Cependant, tout marche parfaitement lorsque je retire mon routeur et que je branche ma machine directement sur mon modem.

    Est-ce un problème au niveau de mon code?
    J'espère que je ne me trompe pas de section avec un problème de routeur...

    Si vous pouviez me donner un petit indice, ce serait avec plaisir!

    Merci!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut
    Sauvé, en changeant simplement winsock2.h en winsock.h, tout marche!

    Je ne sais pas exactement ce que ca change mais bon, ca me convient!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut
    Finalement, je reviens avec un problème similaire...

    Je change un peu:

    Voici un serveur basic (un seul thread) qui est censé écouté sur son port et afficher ce qu'il recoit:

    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 <winsock2.h>
    #include <iostream>
     
    #define PORT 666
     
    using namespace std;
     
    int main(void) {
     WSADATA wsaData;
     WSAStartup(MAKEWORD (2, 2), &wsaData);
     
     SOCKET Listening;
     
     if((Listening = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
      cout << "ERREUR :: Creation de la socket impossible." << endl;
      WSACleanup();
      return 1;
      }
     
     SOCKADDR_IN ServerAddr;
     
     ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
     ServerAddr.sin_family = AF_INET;
     ServerAddr.sin_port = htons(PORT);
     
     if(bind(Listening, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) {
      cout << "ERREUR :: Impossible d'utiliser le port " << PORT << " verifiez qu'il n'est pas deja utilise par un autre processus." << endl;
      closesocket(Listening);
      WSACleanup();
      return 1;
      }
     
     if(listen(Listening, 10) == SOCKET_ERROR) {
      cout << "ERREUR :: listen a echoue avec l'erreur " << WSAGetLastError() << endl;
      closesocket(Listening);
      WSACleanup();
      return 1;
      }
     
     cout << "Ecoute du port " << PORT << " en attente de clients." << endl;
     
     SOCKET Client;
     SOCKADDR_IN ClientAddr;
     
     int ClientAddrLen = sizeof(ClientAddr);
     char data[1024];
     int e;
     
     while(true) {
     
      if((Client = accept(Listening, (SOCKADDR *) &ClientAddr, &ClientAddrLen)) == INVALID_SOCKET) {
       cout << "ERREUR :: Socket Invalide." << endl;
       continue;
       }
     
      cout << "Client connecte ::  IP = " << inet_ntoa(ClientAddr.sin_addr) << " || port = " << ntohs(ClientAddr.sin_port) << endl;
     
      while((e = recv(Client, data, (int) sizeof(data) - 1, 0))) cout << e << "     " << data << endl;
     
      cout << "Client deconnecte" << endl;
     
      }
     
     closesocket(Listening);
     
     WSACleanup();
     
     return 0;
     }
    En fesant telnet 127.0.0.1 666 (sous windows), ca marche comme je l'attends mais quand je met une ip externe, ca ne se passe pas comme je le désire...

    La chose positive est qu'il détecte direct la connection du client et affiche le résultat de l'instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Client connecte ::  IP = " << inet_ntoa(ClientAddr.sin_addr) << " || port = " << ntohs(ClientAddr.sin_port) << endl;
    instantanement.

    Par contre, quand je tente d'envoyer des données, elles n'arrivent pas au serveur, où longtemps après... Si je n'essaye pas d'envoyer de donnée et que je ferme telnet, il détecte la fermeture du client, sinon, il reste en supend.

    Si quelqu'un pouvait me dire ce qui ne va pas...

    (je n'ai pas testé sans routeur, mais il me semble que ca marche mieux, j'ai pas testé depuis un pc externe (hors du réseau) )

    Merci!

Discussions similaires

  1. [Routeur]Configuration d'un routeur
    Par arnaud_verlaine dans le forum Développement
    Réponses: 15
    Dernier message: 25/09/2005, 13h51
  2. Installation et configuration d'un routeur FlowPoint SSR255
    Par arnaud_verlaine dans le forum Développement
    Réponses: 3
    Dernier message: 11/08/2003, 13h43
  3. Quel est le meilleur Routeur-adsl ???
    Par loki dans le forum Développement
    Réponses: 4
    Dernier message: 12/11/2002, 18h05
  4. Connaissez vous un routeur pour ...
    Par loki dans le forum Développement
    Réponses: 3
    Dernier message: 18/09/2002, 09h05
  5. routeur + netmeeting
    Par Vince dans le forum Développement
    Réponses: 5
    Dernier message: 12/07/2002, 15h11

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