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

Compatibilité des Sockets avec les différentes versions de Windows - C++ - Programmation

Marsh Posté le 22-09-2004 à 18:09:22    

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

Reply

Marsh Posté le 22-09-2004 à 18:09:22   

Reply

Marsh Posté le 22-09-2004 à 18:41:42    

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() ?

Reply

Marsh Posté le 22-09-2004 à 18:48:09    

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.

Reply

Marsh Posté le 23-09-2004 à 09:36:01    

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
Reply

Marsh Posté le 23-09-2004 à 09:57:26    

kestion kon ta pas un firewall sur ta machine?


---------------
ici c ma signature j ai pas encore reflechi a ce que je vais mettre
Reply

Marsh Posté le 23-09-2004 à 10:01:43    

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... )

Reply

Marsh Posté le 23-09-2004 à 10:12:07    

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

Reply

Marsh Posté le 23-09-2004 à 10:17:40    

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

Reply

Marsh Posté le 23-09-2004 à 10:19:11    

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.

Reply

Marsh Posté le 23-09-2004 à 10:22:55    

EagleOne33 a écrit :

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


 
Le WSAStartup n'est pas testé?

Reply

Marsh Posté le 23-09-2004 à 10:22:55   

Reply

Marsh Posté le 23-09-2004 à 10:39:17    

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

Reply

Marsh Posté le 23-09-2004 à 10:54:04    

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

Reply

Marsh Posté le 23-09-2004 à 11:09:46    

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.
 

Reply

Marsh Posté le 23-09-2004 à 12:07:18    

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

Reply

Marsh Posté le 23-09-2004 à 12:36:45    

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.

Reply

Marsh Posté le 23-09-2004 à 13:30:48    

oki merci je lis de suite

Reply

Marsh Posté le 23-09-2004 à 13:35:51    

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...

Reply

Marsh Posté le 23-09-2004 à 13:37:01    

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?

Reply

Marsh Posté le 23-09-2004 à 13:43:34    

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

Reply

Marsh Posté le 23-09-2004 à 13:45:00    

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?

Reply

Marsh Posté le 23-09-2004 à 13:50:52    

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 ?

Reply

Marsh Posté le 23-09-2004 à 13:52:37    

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

Reply

Marsh Posté le 23-09-2004 à 13:55:04    

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

Reply

Marsh Posté le 23-09-2004 à 13:59:15    

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

Reply

Marsh Posté le 23-09-2004 à 13:59:58    

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?

Reply

Marsh Posté le 23-09-2004 à 14:02:27    

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. }

Reply

Marsh Posté le 23-09-2004 à 14:05:59    

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

Reply

Marsh Posté le 23-09-2004 à 14:11:15    

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

Reply

Marsh Posté le 23-09-2004 à 14:12:26    

ok je tente

Reply

Marsh Posté le 23-09-2004 à 14:16:01    

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?

Reply

Marsh Posté le 23-09-2004 à 14:19:00    

exact ;)

Reply

Marsh Posté le 23-09-2004 à 14:21:42    

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

Reply

Marsh Posté le 23-09-2004 à 14:23:03    

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
Reply

Marsh Posté le 23-09-2004 à 14:27:09    

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

Reply

Marsh Posté le 23-09-2004 à 14:31:16    

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.

Reply

Marsh Posté le 23-09-2004 à 14:35:01    

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 ?

Reply

Marsh Posté le 23-09-2004 à 14:37:29    

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 ?

Reply

Marsh Posté le 23-09-2004 à 14:38:19    

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

Reply

Marsh Posté le 23-09-2004 à 14:46:20    

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

Reply

Marsh Posté le 23-09-2004 à 14:51:06    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed