Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1292 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Compatibilité des Sockets avec les différentes versions de Windows

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Compatibilité des Sockets avec les différentes versions de Windows

n°855832
EagleOne33
Posté le 22-09-2004 à 18:09:22  profilanswer
 

Bonjour tout le monde,
 
Voilà je développe une application en C++ qui est un client. J'ai en même tps développé un serveur simple.  
Je suis sous Windows2000. Si je lance le serveur sur mon ordinateur et que je lance le client, la communication passe bien entre les deux.  
J'ai un collègue qui est sour Windows98 et s'il lance client et serveur chez lui, la connection ne marche pas (alors que la creation du socket a bien marché et que l'adresse du serveur est valide):

Code :
  1. connect(client, (sockaddr *)&sin, sizeof(sin));


 
Maintenant si je lance le client de chez moi (win2000) et que je me connecte au serveur chez lui (win98), ca marche. L'inverse ne marchant pas...  
 
Donc en gros pour moi, ou que soit le serveur, je m'y connecte. Mais lui n'arrive pas à s'y connecter...  
 
D'ou ma question, existe-t-il des incompatibilités entre les différentes versions de Windows et les sockets ?
 
Merci d'avance

mood
Publicité
Posté le 22-09-2004 à 18:09:22  profilanswer
 

n°855851
cricri_
Posté le 22-09-2004 à 18:41:42  profilanswer
 

Oui il y a des différences, mais normalement ça devrait être bon entre tes 2 windows, car il sont en WinSocket 2, tu mets quoi en paramètres dans WSAStartup() ?

n°855856
cricri_
Posté le 22-09-2004 à 18:48:09  profilanswer
 

Code :
  1. WORD wVersionRequested;
  2. WSADATA wsaData;
  3. int err;
  4. wVersionRequested = MAKEWORD( 2, 0 );
  5. err = WSAStartup( wVersionRequested, &wsaData );
  6. if ( err != 0 ) {
  7.     /* Tell the user that we could not find a usable */


Et tu peux tracer ton client ?
tu fais une gestion des erreurs ?
Attribution des sockets ?
Parceque vu ton code, faudrait tout de même voir à tester tous les retours, etc ... pour comprendre ce qui se passe.

n°856226
EagleOne33
Posté le 23-09-2004 à 09:36:01  profilanswer
 

alors en enlevant la gestion SSL, voici mon code :  

Code :
  1. int __stdcall principal(char *argument, char *result, char *ad_serveur, int port)
  2. {
  3. string inmessage = argument;
  4. string reponse;
  5. int erreur;
  6. struct hostent *nom_serveur;
  7. WSADATA wsa;
  8. /* initialisation */
  9. WSAStartup(MAKEWORD(2,0), &wsa);
  10. int client;
  11. SOCKADDR_IN sin;
  12. nom_serveur=gethostbyname(ad_serveur);
  13. if(nom_serveur==NULL)
  14. {
  15.  reponse = "adresse non valide";
  16.  strcpy(result,reponse.c_str());
  17.  return 0;
  18. }
  19. /* creation de la socket client */
  20. client = socket(AF_INET,SOCK_STREAM,0);
  21. if(client==INVALID_SOCKET)
  22. {
  23.  reponse = "erreur de creation de la socket";
  24.  strcpy(result,reponse.c_str());
  25.  return 0;
  26. }
  27. /* configuration de la socket */
  28. memcpy(&sin.sin_addr,nom_serveur->h_addr,nom_serveur->h_length);
  29. sin.sin_family = AF_INET;
  30. sin.sin_port = htons(port);
  31. /* connecter le client au serveur */
  32. erreur=connect(client, (sockaddr *)&sin, sizeof(sin));
  33. if(erreur==INVALID_SOCKET)
  34. {
  35.  reponse = "erreur de connexion";
  36.  strcpy(result,reponse.c_str());
  37.  return 0;
  38. }
  39. /* fonction qui utilise la socket */
  40. reponse = traitement(client, inmessage);
  41. strcpy(result,reponse.c_str());
  42. /* fermer le socket */
  43. closesocket(client);
  44. WSACleanup();
  45. return 1;
  46. }


 
Et l'erreur que j'obtiens est "erreur de connexion" donc c'est vraiment à la connexion que le problème se pose...


Message édité par EagleOne33 le 23-09-2004 à 09:37:48
n°856234
notalone
je kif le c++
Posté le 23-09-2004 à 09:57:26  profilanswer
 

kestion kon ta pas un firewall sur ta machine?


---------------
ici c ma signature j ai pas encore reflechi a ce que je vais mettre
n°856237
EagleOne33
Posté le 23-09-2004 à 10:01:43  profilanswer
 

Y'a un firewall sur le routeur mais pas sur les postes clients qu'on utilise. D'ailleurs c'est pas le problème puisque ca marche dans un sens (win2000 appelle le serveur sur win98 mais l'appli sur win98 n'appelle le serveur ni sous win2000 ni sous win98... )

n°856244
docmaboul
Posté le 23-09-2004 à 10:12:07  profilanswer
 

Il n'y a pas de threads dans cette histoire à tout hasard?

n°856251
EagleOne33
Posté le 23-09-2004 à 10:17:40  profilanswer
 

bein non... J'ai mis mon code au dessus.

n°856255
cricri_
Posté le 23-09-2004 à 10:19:11  profilanswer
 

EagleOne33 a écrit :


 
Et l'erreur que j'obtiens est "erreur de connexion" donc c'est vraiment à la connexion que le problème se pose...


Ok, mais là l'erreur est très générique, il faut utiliser WSAGetLastError() pour en savoir plus.

n°856259
docmaboul
Posté le 23-09-2004 à 10:22:55  profilanswer
 

EagleOne33 a écrit :

bein non... J'ai mis mon code au dessus.


 
Le WSAStartup n'est pas testé?

mood
Publicité
Posté le 23-09-2004 à 10:22:55  profilanswer
 

n°856275
EagleOne33
Posté le 23-09-2004 à 10:39:17  profilanswer
 

Ok j'essaye avec le WSAGetLastError et je teste en même temps le WSAStartup. Je vous dis ce qu'il en est après

n°856287
cricri_
Posté le 23-09-2004 à 10:54:04  profilanswer
 

bah y aurait déjà une erreur à socket() si c'était le WSAStartup() je pense.

n°856292
docmaboul
Posté le 23-09-2004 à 11:09:46  profilanswer
 

cricri_ a écrit :

bah y aurait déjà une erreur à socket() si c'était le WSAStartup() je pense.


 
Oui. Il manque peut-être aussi un memset 0 sur la tronche de sin.
 

n°856335
EagleOne33
Posté le 23-09-2004 à 12:07:18  profilanswer
 

Bon j'ai récupéré le WSAGetLastError et il me met :
11001 .... hum.... J'en fais quoi moi ?

n°856350
docmaboul
Posté le 23-09-2004 à 12:36:45  profilanswer
 

EagleOne33 a écrit :

Bon j'ai récupéré le WSAGetLastError et il me met :
11001 .... hum.... J'en fais quoi moi ?


 
Vous lisez le fichier winsock2.h. Le token correspondant à ce code d'erreur est explicite.

n°856371
EagleOne33
Posté le 23-09-2004 à 13:30:48  profilanswer
 

oki merci je lis de suite

n°856381
EagleOne33
Posté le 23-09-2004 à 13:35:51  profilanswer
 

Alors mon erreur c'était pas 11001 mais 10065  (vi je m'étais trompé :P)
 
Et apparament, l'erreur correspond à ça :  
"Connection refused by remote network
 
This error occurs when the remote system rejects your attempt to connect with it, either because no server is listening on the specified port or it's unable to accept any additional connections."
 
Mais je ne sais pas du tout d'ou ca peut venir...

n°856383
docmaboul
Posté le 23-09-2004 à 13:37:01  profilanswer
 

EagleOne33 a écrit :

Alors mon erreur c'était pas 11001 mais 10065  (vi je m'étais trompé :P)
 
Et apparament, l'erreur correspond à ça :  
"Connection refused by remote network
 
This error occurs when the remote system rejects your attempt to connect with it, either because no server is listening on the specified port or it's unable to accept any additional connections."
 
Mais je ne sais pas du tout d'ou ca peut venir...


 
et du côté du serveur, ça tourne bien?

n°856387
EagleOne33
Posté le 23-09-2004 à 13:43:34  profilanswer
 

Bein ouai... c'est ca qui est fou... Si je l'appelle depuis la même appli mais depuis un ordi sous win2000, il répond bien et tout

n°856389
docmaboul
Posté le 23-09-2004 à 13:45:00  profilanswer
 

EagleOne33 a écrit :

Bein ouai... c'est ca qui est fou... Si je l'appelle depuis la même appli mais depuis un ordi sous win2000, il répond bien et tout


 
Donc il y a bien des threads, non?

n°856391
EagleOne33
Posté le 23-09-2004 à 13:50:52  profilanswer
 

Bein... des threads je crois pas... Y'a pas de fork si c'est à ca que tu penses.  
 
Moi je fais que des sends de sockets et le serveur fait que des accept... Mais ptet que c'est ca que tu appelles des threads ?

n°856394
cricri_
Posté le 23-09-2004 à 13:52:37  profilanswer
 

en general un accept déclenche un thread pour gérer la connection, de façon à pouvir se remettre à l'écoute facilement.

n°856396
EagleOne33
Posté le 23-09-2004 à 13:55:04  profilanswer
 

ouai ok... admettons... et c'est ca qui pose problème vous pensez ?

n°856398
cricri_
Posté le 23-09-2004 à 13:59:15  profilanswer
 

perso je ne sais pas ou veut en venir Doc, moi je ne vois rien   de spécial avec les threads.

n°856399
docmaboul
Posté le 23-09-2004 à 13:59:58  profilanswer
 

cricri_ a écrit :

en general un accept déclenche un thread pour gérer la connection, de façon à pouvir se remettre à l'écoute facilement.


 
Ca peut s'il n'y a pas d'appels à CoInitialize en début de thread et CoUninitialize en fin. Sinon, à tout hasard, le serveur écoute les connections sur quelle adresse?

n°856400
EagleOne33
Posté le 23-09-2004 à 14:02:27  profilanswer
 

voilà le code de mon serveur :  
 

Code :
  1. /*************************************************************
  2. LE SERVEUR
  3. **************************************************************/
  4. #include <stdio.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <string>
  8. /* includes de windows */
  9. #ifdef WIN32
  10.          #include <winsock.h>
  11.   typedef int socklen_t;
  12.          //typedef unsigned int u_int32_t;    /* utilisé par linux mais non défini dans winsock.h */
  13.   #pragma comment(lib, "ws2_32.lib" )
  14. /* les includes de linux */
  15. #else
  16.          #include <unistd.h>
  17.          #include <sys/socket.h>
  18.          #include <netinet/in.h>
  19.          #include <netdb.h>
  20.          #include <sys/types.h>
  21.          #define SOCKET_ERROR (-1)
  22.   #define INVALID_SOCKET (-1) /* défini dans winsock.h */
  23.          typedef struct sockaddr_in SOCKADDR_IN; /* idem */
  24. #endif
  25. using namespace std;
  26. #define LG_MAX_REQUETE 1024
  27. string creationReponse();
  28. void traitement(int);
  29. void main()
  30. {
  31. int val,port=0,erreur;
  32. #ifdef WIN32
  33. WSADATA wsa;
  34. /* initialisation */
  35. WSAStartup(MAKEWORD(2,0), &wsa);
  36. #endif
  37. int serveur;
  38. int client;
  39. struct sockaddr_in sin;
  40. struct sockaddr_in clientsin;
  41. // saisir la configuration du serveur
  42. /*
  43. printf("Entrez le numero de port: " );
  44. scanf("%d",&port);  
  45. */
  46. // port par defaut pour tests rapides
  47. port = 123;
  48. /* creation de la socket serveur */
  49. serveur=socket(AF_INET,SOCK_STREAM,0);
  50. if(serveur==INVALID_SOCKET)
  51. {
  52.  perror("erreur de creation de la socket" );
  53.  exit(-1);
  54. }
  55. /* configuration de la socket */
  56. sin.sin_addr.s_addr = INADDR_ANY;
  57. sin.sin_family = AF_INET;
  58. sin.sin_port = htons(port);
  59. /* attacher le socket au n° de port*/
  60. erreur=bind(serveur,(sockaddr *)&sin, sizeof(sin));
  61. if(erreur == INVALID_SOCKET)
  62. {
  63.  perror("bind" );
  64.  exit(-1);
  65. }
  66. /* creation d'une file d'attente de demande de connexion */
  67. listen(serveur,0);
  68. val=sizeof(clientsin);
  69. cout << "\n*****Serveur INSEE (simulation) en attente\n\n\n";
  70. while(1)
  71. {
  72.  /* accepter une connexion */
  73.  client=accept(serveur,(sockaddr *)&clientsin,NULL);
  74.  if(client == INVALID_SOCKET)
  75.  {
  76.   perror("erreur de connection" );
  77.   exit(-1);
  78.  }
  79.  /* fonction qui utilise la socket */
  80.  traitement(client);
  81. }
  82. }

n°856401
cricri_
Posté le 23-09-2004 à 14:05:59  profilanswer
 

Mais port 123 c'est qqchose qu'existe déjà ça, non ?

n°856405
cricri_
Posté le 23-09-2004 à 14:11:15  profilanswer
 

vi : 123/tcp Network Time Protocol
 
Essaye un port supérieur non-utilisé pour voir, genre > 1000

n°856406
EagleOne33
Posté le 23-09-2004 à 14:12:26  profilanswer
 

ok je tente

n°856408
docmaboul
Posté le 23-09-2004 à 14:16:01  profilanswer
 

cricri_ a écrit :

Mais port 123 c'est qqchose qu'existe déjà ça, non ?


 
c'est plus le listen non-testé qui me fait douter. Avec 1 en backlog, ça ne marcherait pas mieux?

n°856409
cricri_
Posté le 23-09-2004 à 14:19:00  profilanswer
 

exact ;)

n°856410
EagleOne33
Posté le 23-09-2004 à 14:21:42  profilanswer
 

euuu c'est à dire ? 1 en backlog ? C'est à dire je change quoi ?
je fais listen(serveur, 1) ?

n°856411
docmaboul
Posté le 23-09-2004 à 14:23:03  profilanswer
 

EagleOne33 a écrit :

euuu c'est à dire ? 1 en backlog ? C'est à dire je change quoi ?
je fais listen(serveur, 1) ?


 
oui.
 
edit: enfin, vous pouvez mettre 5 tant qu'à y être. Et tester le retour de l'appel, ce serait pas mal aussi.


Message édité par docmaboul le 23-09-2004 à 14:26:08
n°856413
EagleOne33
Posté le 23-09-2004 à 14:27:09  profilanswer
 

ca change un peu... En fait là depuis chez moi, ca marche
mais depuis win98, il lance le client, rien ne se passe, et au moment ou il ferme le client, y'a une requette (avec que des caractères n'importe comment) qui est recu par le serveur... Donc ils communiquent bien au moins, c'est déjà ca. Mais bon c'est pas ca quoi

n°856417
docmaboul
Posté le 23-09-2004 à 14:31:16  profilanswer
 

EagleOne33 a écrit :

ca change un peu... En fait là depuis chez moi, ca marche
mais depuis win98, il lance le client, rien ne se passe, et au moment ou il ferme le client, y'a une requette (avec que des caractères n'importe comment) qui est recu par le serveur... Donc ils communiquent bien au moins, c'est déjà ca. Mais bon c'est pas ca quoi


 
C'est qu'il doit y avoir d'autres appels miteux ailleurs.

n°856421
EagleOne33
Posté le 23-09-2004 à 14:35:01  profilanswer
 

bein j'ai mis tout mon code là... et je vois pas d'ou ca peut venir.... Surtout que ca marche très bien quand je lance de mon PC. Lui, il a essayé sous win2000,winXP,win98 et ca fait ce que je t'ai dit.  
Alors n'y aurait il pas un problème de librairie ou je ne sais quoi ? un truc d'installé que sur mon ordi mais pas sur les autres ?

n°856425
cricri_
Posté le 23-09-2004 à 14:37:29  profilanswer
 

vi, il faut tester tous les retours pour voir plus précisemment d'où peut venir le pb.
T'as essayé tout de même avec un autre port ?

n°856427
EagleOne33
Posté le 23-09-2004 à 14:38:19  profilanswer
 

ouai je viens d'essayer avec le port 1123... mais ca ne change rien

n°856435
EagleOne33
Posté le 23-09-2004 à 14:46:20  profilanswer
 

Sinon tester les retours, c'est à dire ?  
 
Tester ce que le serveur renvoit au client ? Justement rien...

n°856445
cricri_
Posté le 23-09-2004 à 14:51:06  profilanswer
 

non, comme te l'a dit Doc, tu ne testes pas le retour du Listen(), donc vérifie et teste tous les retours de fonctions sans exceptions.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Compatibilité des Sockets avec les différentes versions de Windows

 

Sujets relatifs
services windows via phpVisual Studio 2003 et appli IIS sur Windows 2003 Server
Effet 3d : faire une vaguelette sur le bureau windows en DirectX ?Copier des raccourcis sur le bureau suivant les versions de Windows
Glade et STL sous WindowsApplication Web ou Windows ? Le pour le contre ?
Compatibilité mscomct2Oracle 8i: Driver ODBC 16 bits pour Windows 2000
Windows peut il controler un prog executé en assembleur? 
Plus de sujets relatifs à : Compatibilité des Sockets avec les différentes versions de Windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR