Winsock2 et Wifi

Résolu
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 juillet 2007 - 27 juil. 2007 à 16:33
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 juillet 2007 - 30 juil. 2007 à 11:28
Bonjour,

Je programme sous Visual C++ et je souhaite établir une connection UDP entre deux pc via une liaison Wifi. J'ai essayé avec Winsock2 mais ca ne marche pas en Wifi (réseau ad hoc). Par contre j'ai testé en LAN la connexion s'établit parfaitement.
Est ce qu'il est impossible d'établir la connection en Wifi en utilisant Winsock2? Pouvez vous m'aider svp?

Merci  d'avance.
voici le code que j'ai implémenté pour le serveur.
// IAMNet.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include "IAMNet.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// Seul et unique objet application

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // Initialise MFC et affiche un message d'erreur en cas d'échec
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO : modifiez le code d'erreur selon les besoins
        _tprintf(_T("Erreur irrécupérable : l'initialisation MFC a échoué\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO : codez le comportement de l'application à cet emplacement.
        WSADATA WSAData;
        SOCKET sock;
        SOCKADDR_IN clientsin;
        SOCKET csock;
        SOCKADDR_IN sin;
        SOCKADDR_IN csin;
        CHAR buff;
        WSAStartup(MAKEWORD(2,0), &WSAData);

        cout<<"hello\n\r";

        sin.sin_addr.s_addr    = INADDR_ANY;
        sin.sin_family        = AF_INET;
        sin.sin_port        = htons(50014);
        sock = socket(AF_INET,SOCK_STREAM,0);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        gethostname(&buff, sizeof(buff));
        listen(sock, 0);
       
        int val = 0;

        while(1)
        {
            int sinsize = sizeof(csin);
            if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
            {
               
                int size = sizeof(clientsin);
                int succes = getpeername(csock,(SOCKADDR *)&clientsin, &size);
                int a = WSAGetLastError();
               
                send(csock, "Hello world!\r\n", 30, 0);
                cout<<"client connected \n\r";
            }
        }
}

    return nRetCode;
}

voici le code que j'ai implémenter pour le client.

// iamclient.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include "iamclient.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// Seul et unique objet application

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // Initialise MFC et affiche un message d'erreur en cas d'échec
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO : modifiez le code d'erreur selon les besoins
        _tprintf(_T("Erreur irrécupérable : l'initialisation MFC a échoué\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO : codez le comportement de l'application à cet emplacement.
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);       
        SOCKET sock;
        SOCKADDR_IN sin;
        char *buff = new char[255];
        sin.sin_addr.s_addr    = inet_addr("180.0.0.2");
        sin.sin_family        = AF_INET;
        sin.sin_port        = htons(4148);
        sock = socket(AF_INET,SOCK_STREAM,0);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        while(1)
        {
            recv(sock, buff, sizeof(buff),0);
            cout<<buff;
        }
    }

    return nRetCode;
}

5 réponses

cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
27 juil. 2007 à 19:39
Pour winsock, aucune différence entre liaison Wifi filaire...

Dans ton code que tu poste :

    * le port du serveur n'est pas le même que celui sur lequel le client veut se connecter
    * l'addresse IP du server en WIFI est- elle la même car le client se connect à une IP en dur...

J'ai implementé une librairie C++ pour ma boite fonctionnant en TCP (filaire, WIFI, ..), Irda et bluetooth.
Le code est stritement le même pour Wifi et filaire.
Seules les implémentation Irda et bluetooth de Winsock exige un peu de code particuliers
3
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
30 juil. 2007 à 09:06
la seul différence de traitement entre le wifi et du eth c'est le traitement des fonctions spéciales pour le raw socket (codes erreur) sinon sa fonctionne exactement pareil.

Pour info avant de continué dans ton code test si chacune des fonction s'effectue correctement tu éviteras ainsi tout un tas de bugs introuvables ^^ :p
0
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 juillet 2007
30 juil. 2007 à 10:26
Bonjour à tous et merci pour vos réponses.

J'ai fait les modifs pour les adresses et les ports. J'ai oublié de préciser que lorsque je teste sur un seul ordinateur les deux codes cela marche en Wifi. C'est à dire, lorsque je me connecte en passant en dur l'IP du server au code client sur le même ordinateur ça marche sans problème.

C'est lorsque je passe l'exe généré à l'autre ordinateur que la connection ne s'établie pas. Existe t-il des problèmes de pare-feu ou de filtrage d'adresse en mode Ad-Hoc pour le Wifi ?? Ou sinon je me trompe complètement...

En tout cas j'ai testé les fonctions une à une et elle marche en locale mais pas lorsque je tente une connection à un ordinateur distant.

Petite précision, j'ai tenté de streamer un flux vidéo avec VLC et ca marche sans problème.

Merci d'avance pour votre aide.
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
30 juil. 2007 à 11:00
tu as bien pensé a mettre ton exé en release et non debug ?
sinon ce genre de problème sont fréquent sous visual... dans le cas de mauvaise déclaration, ou buffer overflow.

pour ce qui est de ton problème, le firewall windows et le cnetre de sécurité sont activé ? et leurs services respectifs ? ou autre logiciels du genre ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 juillet 2007
30 juil. 2007 à 11:28
Salut.

Ca y est ca marche! J'ai changé l'adresse IP des deux pcs et j'ai attribués moi meme les adresses. J'ai rentré des adresses comprises dans les plages d'adresses privées et maintenant ca marche sans problème.

Merci beaucoup pour votre aide.
0
Rejoignez-nous