FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  probleme inexplicable avec les sockets sous windows

 




Il y a 28 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme inexplicable avec les sockets sous windows

n°5662
toetoe
toetoe
Posté le 17-05-2005 à 21:40:53  profilanswer
 

slt !!
je suis entrain d'apprendre a manipuler le sockets en c++ en lisant certains pdf et visitants klk sites malgre tous ça j'arrive pas a realiser mon code ki a comme project coder un client/serveur du chat voiçi les deux code
*************************le client********************************
#include<iostream.h>
#include<stdio.h>
 
#include<winsock2.h>
 
#pragma comment(lib,"ws2_32.lib" )
 
void main()
{
 WSADATA wsa;
 WSAStartup(MAKEWORD(2,0),&wsa);
 
    cout<<"attendez s'il vous plait!!"<<endl;
 SOCKET sock;
 SOCKET serveur;
 
 SOCKADDR_IN option;
 option.sin_addr.s_addr=inet_addr("81.192.19.32" );
 option.sin_family= AF_INET;
 option.sin_port=htons(50);
 sock=socket(AF_INET,SOCK_STREAM,0);
 serveur=socket(AF_INET,SOCK_STREAM,0);
 char buff[222],buff1[222];
 while(1)
 {
 connect(sock,(SOCKADDR*)&option,sizeof(option));
 
  while(int(connect(sock,(SOCKADDR*)&option,sizeof(option)))!=INVALID_SOCKET)
  {
   cout<<"connection etablie"<<endl;
   for(;;)
   {
   cout<<"client = "<<endl;
 
   gets(buff);
   
   send(serveur,buff,sizeof(buff),0);
 
   cout<<endl;
 
   recv(sock,buff1,sizeof(buff1),0);
   cout<<buff<<endl;
   }
  }
 }
 
}
******************************le serveur**************************
#include<iostream.h>
 
#include<stdio.h>
 
#include<winsock2.h>
 
#pragma comment(lib,"ws2_32.lib" )
 
void main()
{
 
 
 WSADATA mywinsock;
 WSAStartup(MAKEWORD(2,0),&mywinsock);
 
 SOCKET sock;
 SOCKET serveur;
 
 SOCKADDR_IN option;
 SOCKADDR_IN client;
    option.sin_addr.s_addr = htonl(INADDR_ANY);
 option.sin_family=AF_INET;
 option.sin_port=htons(50);
 sock=socket(AF_INET,SOCK_STREAM,0);
 serveur=socket(AF_INET,SOCK_STREAM,0);
 bind(sock,(SOCKADDR*)&option,sizeof(option));
 int americ=sizeof(option);
 char recevoir[222];
 char envoyer[222];
 listen(sock,0);
 while(1)
 {
  accept(sock,(SOCKADDR*)&client,&americ);
        if(accept(sock,(SOCKADDR*)&client,&americ)!=INVALID_SOCKET)
  {
  cout<<"connection etablie!!"<<endl;
        while(1)
  {
  recv(serveur,recevoir,sizeof(recevoir),0);
  cout<<recevoir<<endl;
 
  gets(envoyer);
  cout<<endl;
  send(sock,envoyer,sizeof(envoyer),0);
                }
  }
  else
  {
  }
 }
}
le compilateur ne signale aucune erreur par contre lors l'execution du programme rien ne se passe on constate comme si le client ne se connecte pas au serveur l

mood
Google
Posté le 17-05-2005 à 21:40:53  profilanswer
 

n°5663
nicodache
marmotte en chocolat concept ©
Posté le 17-05-2005 à 21:48:49  profilanswer
 

(édite ton message, et entoure ton code (début et fin) des balises [ cpp] et [/ cpp] ;))


Message édité par nicodache le 17-05-2005 à 21:49:33

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5664
toetoe
toetoe
Posté le 18-05-2005 à 00:53:40  profilanswer
 

je crois pas que ça va resoudre le probleme pck que mon client ne se connecte meme pas au serveur en plus peut tu me dire stp keske tu ve dire avec (edite ton message....................)car je vois pas comment l'edit va resoudre le probleme et grand merçi d'avance
et @@++

n°5665
nicodache
marmotte en chocolat concept ©
Posté le 18-05-2005 à 00:54:47  profilanswer
 

ca va rien résoudre, ca va juste rendre ton code plus lisible pour nous ;)
 
démonstration :

Code :
  1. *************************le client********************************
  2. #include<iostream.h>
  3. #include<stdio.h>
  4. #include<winsock2.h>
  5. #pragma comment(lib,"ws2_32.lib" )
  6. void main()
  7. {
  8. WSADATA wsa;
  9. WSAStartup(MAKEWORD(2,0),&wsa);
  10.     cout<<"attendez s'il vous plait!!"<<endl;
  11. SOCKET sock;
  12. SOCKET serveur;
  13. SOCKADDR_IN option;
  14. option.sin_addr.s_addr=inet_addr("81.192.19.32" );
  15. option.sin_family= AF_INET;
  16. option.sin_port=htons(50);
  17. sock=socket(AF_INET,SOCK_STREAM,0);
  18. serveur=socket(AF_INET,SOCK_STREAM,0);
  19. char buff[222],buff1[222];
  20. while(1)
  21. {
  22. connect(sock,(SOCKADDR*)&option,sizeof(option));
  23.   while(int(connect(sock,(SOCKADDR*)&option,sizeof(option)))!=INVALID_SOCKET)
  24.   {
  25.    cout<<"connection etablie"<<endl;
  26.    for(;;)
  27.    {
  28.    cout<<"client = "<<endl;
  29.    gets(buff);
  30.  
  31.    send(serveur,buff,sizeof(buff),0);
  32.    cout<<endl;
  33.    recv(sock,buff1,sizeof(buff1),0);
  34.    cout<<buff<<endl;
  35.    }
  36.   }
  37. }
  38. }
  39. ******************************le serveur**************************
  40. #include<iostream.h>
  41. #include<stdio.h>
  42. #include<winsock2.h>
  43. #pragma comment(lib,"ws2_32.lib" )
  44. void main()
  45. {
  46. WSADATA mywinsock;
  47. WSAStartup(MAKEWORD(2,0),&mywinsock);
  48. SOCKET sock;
  49. SOCKET serveur;
  50. SOCKADDR_IN option;
  51. SOCKADDR_IN client;
  52.     option.sin_addr.s_addr = htonl(INADDR_ANY);
  53. option.sin_family=AF_INET;
  54. option.sin_port=htons(50);
  55. sock=socket(AF_INET,SOCK_STREAM,0);
  56. serveur=socket(AF_INET,SOCK_STREAM,0);
  57. bind(sock,(SOCKADDR*)&option,sizeof(option));
  58. int americ=sizeof(option);
  59. char recevoir[222];
  60. char envoyer[222];
  61. listen(sock,0);
  62. while(1)
  63. {
  64.   accept(sock,(SOCKADDR*)&client,&americ);
  65.         if(accept(sock,(SOCKADDR*)&client,&americ)!=INVALID_SOCKET)
  66.   {
  67.   cout<<"connection etablie!!"<<endl;
  68.         while(1)
  69.   {
  70.   recv(serveur,recevoir,sizeof(recevoir),0);
  71.   cout<<recevoir<<endl;
  72.   gets(envoyer);
  73.   cout<<endl;
  74.   send(sock,envoyer,sizeof(envoyer),0);
  75.                 }
  76.   }
  77.   else
  78.   {
  79.   }
  80. }
  81. }


 
[edit]tant que j'y suis, faire un else {}, ca sert absolument à rien, et tu peux le virer ;)


Message édité par nicodache le 18-05-2005 à 10:24:00

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5666
Deather2
OpenBSD: the way to go!
Posté le 18-05-2005 à 06:42:28  profilanswer
 

Euh déjà je vois pas pourquoi y'a deux sockets par programme, une seule suffit.
J'ai fais un tuto pour les sockets BSD, ça pourra sûrement t'aider un peu :
http://imaga.zapto.org/~deather/SocketBSD.txt

n°5670
toetoe
toetoe
Posté le 18-05-2005 à 16:21:59  profilanswer
 

slt  !!!!
j'ai declarer deux sockets pck j'utilise 1 pour envoyer et l'autre pour recevoir c'est simple on peut pas utiliser meme socket pour les deux actions  
et @@+++

n°5671
toetoe
toetoe
Posté le 18-05-2005 à 16:24:54  profilanswer
 

re !!!
une petite remarque le site que tu m'a donner est pour c pas pou le c++
et @@++

n°5673
nicodache
marmotte en chocolat concept ©
Posté le 18-05-2005 à 16:43:14  profilanswer
 

tu sais ou est la différence entre le C et le C++ ?
dans l'orienté objet...
tu peux faire du C avec un compilateur C++  si ca t'amuse ;)


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5675
toetoe
toetoe
Posté le 18-05-2005 à 17:01:46  profilanswer
 

meme si j'ai supprimer else{},ça n'a rien donner malheureusement,y a til klk1 ki pe m'aider s'il vous plait
@@+++++

n°5676
Deather2
OpenBSD: the way to go!
Posté le 18-05-2005 à 17:26:45  profilanswer
 

toetoe a écrit :

slt  !!!!
j'ai declarer deux sockets pck j'utilise 1 pour envoyer et l'autre pour recevoir c'est simple on peut pas utiliser meme socket pour les deux actions  
et @@+++


Bien sur que si on peut :heink:

n°5677
nicodache
marmotte en chocolat concept ©
Posté le 18-05-2005 à 19:47:30  profilanswer
 

c'est ca l'avantage des sockets :D
 
tu peux tout faire avec ca [:lol2]


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5678
nicodache
marmotte en chocolat concept ©
Posté le 18-05-2005 à 19:56:44  profilanswer
 

bon, excusez moi pour ce 3eme recopiage du code.
remise en forme plus cohérente et lisibible; admirez [:dslam]
 

Code :
  1. /******************************************************************************/
  2. /*                                 le client                                  */
  3. /******************************************************************************/
  4. #include <iostream.h>
  5. #include <stdio.h>
  6. #include <winsock2.h>
  7. #pragma comment(lib, "ws2_32.lib" )
  8. void main()
  9. {
  10.     WSADATA wsa;
  11.     WSAStartup(MAKEWORD(2,0),&wsa);
  12.     cout << "attendez s'il vous plait !!" << endl;
  13.     SOCKET sock;
  14.     SOCKET serveur;
  15.     SOCKADDR_IN option;
  16.     option.sin_addr.s_addr = inet_addr("81.192.19.32" );
  17.     option.sin_family = AF_INET;
  18.     option.sin_port = htons(50);
  19.     sock = socket(AF_INET, SOCK_STREAM, 0);
  20.     serveur = socket(AF_INET, SOCK_STREAM, 0);
  21.     char buff[222];
  22.     char buff1[222];
  23.     while(1)
  24.     {
  25.         connect(sock, (SOCKADDR*)&option, sizeof(option));
  26.         while (int (connect(sock, (SOCKADDR*)&option, sizeof(option))) != INVALID_SOCKET)
  27.         {
  28.             cout << "connection etablie" << endl;
  29.             for(;;)
  30.             {
  31.                 cout << "client = " << endl;
  32.                 gets(buff);
  33.                 send(serveur, buff, sizeof(buff), 0);
  34.                 cout << endl;
  35.                 recv(sock, buff1, sizeof(buff1), 0);
  36.                 cout << buff << endl;
  37.             }
  38.         }
  39.     }
  40. }


 

Code :
  1. /******************************************************************************/
  2. /*                               le serveur                                   */
  3. /******************************************************************************/
  4. #include <iostream.h>
  5. #include <stdio.h>
  6. #include <winsock2.h>
  7. #pragma comment(lib,"ws2_32.lib" )
  8. void main()
  9. {
  10.     WSADATA mywinsock;
  11.     WSAStartup(MAKEWORD(2, 0), &mywinsock);
  12.     SOCKET sock;
  13.     SOCKET serveur;
  14.     SOCKADDR_IN client;
  15.     SOCKADDR_IN option;
  16.     option.sin_addr.s_addr = htonl(INADDR_ANY);
  17.     option.sin_family = AF_INET;
  18.     option.sin_port = htons(50);
  19.     sock = socket(AF_INET, SOCK_STREAM, 0);
  20.     serveur = socket(AF_INET, SOCK_STREAM, 0);
  21.     int americ = sizeof(option);
  22.     char recevoir[222];
  23.     char envoyer[222];
  24.     bind(sock, (SOCKADDR*)&option, sizeof(option));
  25.     listen(sock, 0);
  26.     while(1)
  27.     {
  28.         accept(sock, (SOCKADDR*)&client, &americ);
  29.         if (accept(sock, (SOCKADDR*)&client, &americ) != INVALID_SOCKET)
  30.         {
  31.             cout << "connection etablie !!" << endl;
  32.             while(1)
  33.             {
  34.                 recv(serveur, recevoir, sizeof(recevoir), 0);
  35.                 cout << recevoir << endl;
  36.                 gets(envoyer);
  37.                 cout << endl;
  38.                 send(sock, envoyer, sizeof(envoyer), 0);
  39.             }
  40.         }
  41.     }
  42. }


 
Si qqun comprend quelque chose à son code plein de boucles infinies que saimal ©


Message édité par nicodache le 18-05-2005 à 19:59:20

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5679
CryoGen
Powered by kitkat©
Posté le 18-05-2005 à 22:44:21  profilanswer
 

oulalalala ^^
 

Code :
  1. accept(sock, (SOCKADDR*)&client, &americ);
  2. if (accept(sock, (SOCKADDR*)&client, &americ) != INVALID_SOCKET)


 
où est l'interet de faire 2 accept à la suite ? pareil pour le connect() ...


---------------
I am the bone of my sword...
n°5680
M4vrick
Inventeur de la Watercase
Posté le 18-05-2005 à 23:41:39  profilanswer
 

argl... y'as des while(1) ... je propose l'ecartellement et ensuite le bucher pour lui apprendre :D


---------------
--== M4vr|ck ==--  Le Tuning jusqu'au bout des cables
Flea Award 2003 de la machine la plus artistique au PC Tuning Show
n°5681
toetoe
toetoe
Posté le 18-05-2005 à 23:46:10  profilanswer
 

slt !!!
j'ai fait la deuxieme accept() pour savoir si la connection est etablie sinon le programme va reintiliser socket en plus je voudrais eviter la declaration d'autre socket ki recupere la valeur retournee par accept()cpour ce la j'ai reecrit toute la phrase .enfin tous les boucles sont interressants chacune deux a une fonction,la premiere if()me previens si la connection est etablie et la dexieme while(1) afin d'eviter la repetition de cout<<"connection etablie"<<endl;
bein vous pouvez maintenant me corriger le code s'il vous plait???
@@++

n°5682
M4vrick
Inventeur de la Watercase
Posté le 18-05-2005 à 23:58:52  profilanswer
 

non on peut pas... on peut t'aider a comprendre mais on ne vas pas te corriger le code comme ca parce que tu le demande... il faut avoir un minimum de savoir vivre...


---------------
--== M4vr|ck ==--  Le Tuning jusqu'au bout des cables
Flea Award 2003 de la machine la plus artistique au PC Tuning Show
n°5683
CryoGen
Powered by kitkat©
Posté le 19-05-2005 à 00:14:48  profilanswer
 

toetoe a écrit :

slt !!!
j'ai fait la deuxieme accept() pour savoir si la connection est etablie


 
oui j'avais compris, donc le premier accept() sers à rien...


---------------
I am the bone of my sword...
n°5684
Deather2
OpenBSD: the way to go!
Posté le 19-05-2005 à 00:48:37  profilanswer
 

toetoe a écrit :

re !!!
une petite remarque le site que tu m'a donner est pour c pas pou le c++
et @@++


Salut,
Le site que je t'ai donné c'est un texte écrit par moi même.
Les sockets et les Winsocks sont écrit en C, et ça marche très bien en C++.
D'ailleurs, dans ton code y'a presque que du C ormi les cout ...
Le C++ ne va pas sans le C. (Du moins côté appels système)
Je te conseil de te réferer à mon tutorial, qui sans être le meilleur certes, est à mon avis une bonne base, testée et fiable.
A+ :)

n°5697
toetoe
toetoe
Posté le 19-05-2005 à 22:37:06  profilanswer
 

slt !!
personnellement j'ai fourni beaucoups d'efforts pour corriger ou au moins corriger le code mais ça na rien donne alors pk pas demander de l'aide  
@@@++++

n°5698
nicodache
marmotte en chocolat concept ©
Posté le 19-05-2005 à 22:43:05  profilanswer
 

première remarque :
dans mes souvenirs de cours de C, quand tu déclares un int machin, sa valeur se trouve en mémoire à l'adresse &machin, mais tu accèdes à la valeur en demandant simplement machin.
 
donc, au lieu d'écrire

Code :
  1. if (accept(sock, (SOCKADDR*)&client, &americ) != INVALID_SOCKET)

pour recevoir un truc de la taille de option (voir plus haut), tu devrais écrire un truc du genre

Code :
  1. if (accept(sock, (SOCKADDR*)&client, americ) != INVALID_SOCKET)


 
mais ca fait longtemps que j'ai plus fait de C, et j'ai jamais été doué :whistle:


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5701
Deather2
OpenBSD: the way to go!
Posté le 20-05-2005 à 00:24:17  profilanswer
 

Non, cf le synopsis d'accept():

Code :
  1. int accept(int s, struct sockaddr *addr, socklen_t *addrlen);


;)

n°5702
nicodache
marmotte en chocolat concept ©
Posté le 20-05-2005 à 01:08:17  profilanswer
 

* != &, nan ?


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5703
Deather2
OpenBSD: the way to go!
Posté le 20-05-2005 à 07:27:31  profilanswer
 

Ben il a un int qui défini la taille de struct sockaddr.
accept() prend un pointeur vers cette valeure donc il doit passer &americ ;)
Note que la variable devrait etre de type size_t (unsigned int)

n°5705
toetoe
toetoe
Posté le 20-05-2005 à 09:06:03  profilanswer
 

j'ai le meme avis ke toi deather,et j'en suis sur kon doit mettre le pointeur
@@+++

n°5709
Deadog
Dain Bramaged
Posté le 20-05-2005 à 16:00:46  profilanswer
 

Code :
  1. if (accept(sock, (SOCKADDR*)&client, (socklen_t *) &americ) != INVALID_SOCKET)


 
:o
 
et on dit prototype, pas synopsis :D

n°5712
toetoe
toetoe
Posté le 20-05-2005 à 18:33:35  profilanswer
 

mais y'a pas de faute ou koi????????????????

n°5713
Deadog
Dain Bramaged
Posté le 20-05-2005 à 19:44:11  profilanswer
 

oui, y'a une faute, pke tu n'avais pas recasté :o

n°5714
Deather2
OpenBSD: the way to go!
Posté le 20-05-2005 à 22:00:15  profilanswer
 

Deadog a écrit :

Code :
  1. if (accept(sock, (SOCKADDR*)&client, (socklen_t *) &americ) != INVALID_SOCKET)


 
:o
 
et on dit prototype, pas synopsis :D


Oui bein j'ai copié bettement ce qu'il y'a marqué dans la man page :o :D

n°5715
nicodache
marmotte en chocolat concept ©
Posté le 20-05-2005 à 22:00:44  profilanswer
 

synopsis c'est en anglais :o


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5716
Deadog
Dain Bramaged
Posté le 20-05-2005 à 22:24:01  profilanswer
 

le synopsis des man pages n'est pas la même chose que le prototypage, puisque le synopsis indique aussi les header à inclure

mood
Google
Posté le 20-05-2005 à 22:24:01  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  probleme inexplicable avec les sockets sous windows

 

Hit Parade