locked
probleme avec les sockets ethernet et CE5.0 RRS feed

  • Question

  • Bonjour,

    Je vous soumets un probleme qui me dérange fortement pour une de mes applications.

    Je cherche a transmettre des informations via des sockets entre 2 systemes win CE 5 (un client et un serveur).

    Mon systeme est opérationnel mais j'ai un soucis au niveau de la connexion, celle ci se fait correctement si j'ai activesync de branché de branché lors de la connexion au socket coté client.

    Mais si activesync n'est pas connecté, il m'est impossible de me connecter au socket a partir du client.

    En revanche si une fois la connexion etablie je débranche l'usb mon programme marche toujours impeccable et je peut toujours transmettre des infos.

    J'utilise les fonctions classique d'acces au socket:

    WSAStartup
    gethostbyname
    connect

    Je suppose que j'ai oublié une fonction qu'activesync initialise de son coté ce qui expliquerai que lorsque celui ci est actif mon socket peut se connecter mais j'avoue ne pas du tout voir laquelle...

    Pouvez vous m'aider?


    Merci d'avance





    mercredi 29 octobre 2008 16:26

Réponses

  • Bonjour,

     

    OK, toutefois je ne suis pas certain que gethostbyname("chaine adresse") et inet_addr("chaine adresse") passent par les mêmes chemins, a priori inet_addr ne sollicite pas le protocole ARP.

     

    Par ailleurs j'ai deux questions pour mieux cerner le problème:

    1/ l'USB est-il branché côté client ou côté serveur (ou bien c'est indifférent) ?

    2/ Avez-vous construit vous-même votre OS WinCE ou bien s'agit-il d'un OS type "Mobile" ?

     

    Cordialement,

     

    Thierry Joubert - THEORIS

    jeudi 30 octobre 2008 12:27

Toutes les réponses

  • Bonjour,

     

    Il n'y a pas a ma connaissance de fonction "spéciale ActiveSync" pour faire des communications socket, celles qui sont citées suffisent pour un client TCP. Toutefois lorsqu'il est actif, ActiveSync "monte" une connexion TCP/IP au dessus du lien USB. Il est possible que ce soit cela qui cause le problème si c'est cette connexion qui répond au GetHostByName (protocole ARP).

     

    Sans ActiveSync est-ce-que le client a une IP (ipconfig) ? et voit-il le serveur (ping) ?. Si c'est le cas il faudrait essayer de remplacer GetHostByName par l'IP du serveur pour voir si c'est un problème de réponse ARP de la part de la machine serveur.

     

    voici un bout de code client TCP qui marche avec hostname= AAA.BBB.CCC.DDD (fonction inet_addr)

    Code Snippet

    /* initialise WINSOCK.DLL */
     if (WSAStartup(version, &wsa_data) != 0)
      return -1;

     /* Ouverture socket */
     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
      return -2;

     /* Initialise l'addresse du serveur */
     memset((char *) &sin, 0, sizeof(sin));
     sin.sin_family = AF_INET;
     net_addr = inet_addr(hostname);
     /* si hostname n'est pas déja une adresse IP */
     if (net_addr == INADDR_NONE)
     {
      /* on tente la résolution d'un nom de machine en adresse IP */
      hp = gethostbyname(hostname);
      if (hp == NULL)
      {
       sprintf(txt, "erreur = %d" , WSAGetLastError());
       MessageBox(NULL, txt, "erreur", MB_OK);
       closesocket(sock);
       return -3;
      }
      memcpy(&net_addr,hp->h_addr_list[0],hp->h_length);
     }
     sin.sin_addr.s_addr = net_addr;
     sin.sin_port = htons(tcp_port);

     /*  Tente 5 connexions au serveur */
     while (((etat_connection = connect(sock, (struct sockaddr far*)&sin, sizeof(sin))) < 0) && (timer < 5))
      timer++;

     

     

    Cordialement,

     

    Thierry Joubert - THEORIS

    mercredi 29 octobre 2008 18:10
  • Bonjour,

    Merci pour votre réponse.

    Malheureusement c'est déja la méthode que j'utilise.

    Je défini directement l'IP vers lequel je veux me connecter.


    Code Snippet

    int LectureEffectuee,toto;



    int err = WSAStartup(MAKEWORD(2, 2), &wsa);

    sock = socket(AF_INET, SOCK_STREAM, 0);

    struct hostent *hostinfo = NULL;

    SOCKADDR_IN sin = { 0 };
    const char *hostname = "192.168.1.249";


    hostinfo = gethostbyname(hostname);
    if (hostinfo == NULL)
    {
    fprintf (stderr, "Unknown host %s\n", hostname);
    system("PAUSE");
    exit(EXIT_FAILURE);
    }
    else
    {
    printf("Informations bien recuperées de la part de l'hote\n");
    }

    sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr;
    sin.sin_port = htons(27292);
    sin.sin_family = AF_INET;

    if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
    printf("impossible de se connecter a l'hote\n");
    system("PAUSE");
    exit(EXIT_FAILURE);
    }
    else
    {
    printf("Connecté à l'hote\n");
    }





    Peut etre ai-je loupé quelque chose?

    Je vous tiens au courant si je trouve quelque chose.

    EDIT: Je viens de contrôler et les ping marchent bien dans les 2 sens.


    @+
    jeudi 30 octobre 2008 09:14
  • Bonjour,

     

    OK, toutefois je ne suis pas certain que gethostbyname("chaine adresse") et inet_addr("chaine adresse") passent par les mêmes chemins, a priori inet_addr ne sollicite pas le protocole ARP.

     

    Par ailleurs j'ai deux questions pour mieux cerner le problème:

    1/ l'USB est-il branché côté client ou côté serveur (ou bien c'est indifférent) ?

    2/ Avez-vous construit vous-même votre OS WinCE ou bien s'agit-il d'un OS type "Mobile" ?

     

    Cordialement,

     

    Thierry Joubert - THEORIS

    jeudi 30 octobre 2008 12:27
  • Merci beaucoup pour cette réponse, je vais chercher du coté du gethostbyname et du inet_addr...

    Pour l'usb il faut que ce soit le client qui soit connecté en USB pour que la connexion s'établisse.

    Pour l'image il s'agit d'une image par défaut d'origine TORADEX pour processeur PXA320 et PXA270 (nous avons fait l'essai en inversant l'hôte et le client et c'est bien coté client que l'usb doit être branché, quelque soit le proç.)


    Cordialement,

    Vincent DECAUX





    jeudi 30 octobre 2008 14:52
  • Apres quelques recherches aupres du inet_addr qui se sont averées infructueuses, je me suis tourné vers la fonction getaddrinfo qui semble fonctionner correctement...

    Merci beaucoup pour votre aide

    Cordialement,

    Vincent DECAUX
    mardi 4 novembre 2008 07:43
  • Bonne nouvelle, je vois dans votre exemple de code que vous utilisez les WinSock en version 2.2. La fonction getaddrinfo a été introduite avec la version 2.0. J'utilise inet_addr avec la version WinSock  1.1 (compatibilité BSD ce qui n'apparaissait pas dans mon bout de code...), ce qui peut expliquer l'écart de comportement.

     

    Merci pour le retour et bon courage pour la suite.

     

    Thierry Joubert - THEORIS

    mardi 4 novembre 2008 18:33