Soyez sympas, g un pb client/server...:(((

Résolu
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 28 nov. 2004 à 12:57
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 28 nov. 2004 à 23:19
Salut all !

J'ai cherché pdt des heures à faire fonctionner mon client et mon server, sans succès! :(
En fait, g vu des sources ici qui m'ont appris a faire correctement le passage d'informations d'un client à un server (en TCP ou UDP) mais le pb, c'est que chez moi, le Client et le Server doivent communiquer dans les 2sens...en clair, le client envoie un requete au server, le server y réponds et par exemple, le server, envoie, tt seul, sans demande du client, des infos.....

J'ai essayé ac pas mal de trucs, mais sans succes! Si qqunpeut m'aider plz!!! Si vous voulez, je poste le morceau de code que j'ai fait...:|

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))

25 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 nov. 2004 à 23:19
Salut,
C'est un ebook, que tu peux télécharger.
3
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
28 nov. 2004 à 13:09
Salut,

Franchement tu fais pas beaucoup d'éffort. Tu ne risque pas de te fouler un neurone ! Sur le site tu as tous les exemples qu'il faut !

De plus c'est pas une fois la création du socket faite et la connexion établies il suffit de faire du recv() ou send()...

@+
Arnotic,
Admin CS, MVP Visual C++
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
28 nov. 2004 à 13:24
si tu veux savoir où ton prog plante, mais des if partout. Mon coup de main : les fonctions recv() et send() retourne -1 quand elle plante. Donc si elles plante utilise printf("%s", WSAGetLastError()); pour afficher le numéro de l'erreur que tu recherchera dans MSDN.
Ca va te paraitre difficile mais même moi je suis passer par là il n'y a pas longtemps.
Bonne continuation
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 nov. 2004 à 13:35
j'ai un exemple sous nux si ça t'intyeresse...
0

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

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
28 nov. 2004 à 15:18
Arnotic > J'ai lu ces put... de sources, je te remercie!! Je les ai lues et comprises, d'ailleurs sit u savais lire, tu aurais compris mon topic!! Mais il n'y a nul part expliqué comment faire fonctionner le processus dans les 2sens !!

Et pr note d'info, je sais largement me servir de recv(), send(), et mem sendto() et recvfrom()....je sais config mon server et mon client correctement !! Dc l'histoire du neuronne...stp, garde toi la!

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 nov. 2004 à 15:41
minet03> printf("%s", WSAGetLastError());
ca risque de donner un résultat pas très joli car WSAGetLastError() renvoie un int

Gendal67> Dans les deux sens c'est pareil, tu n'a même pas besoin de savoir si tu es serveur ou client, dans les 2 cas tu utilise send pour envoyer et recv pour recevoir. Du moins c'est ce que j'ai cru comprendre ca je commence juste a utiliser ces fonctions.

Regarde cette source, ca va dans les 2 sens:
http://www.cppfrance.com/code.aspx?id=24128
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
28 nov. 2004 à 15:51
dsl, je me suis tromper, et puis si tu ne veux pas qu'on te réponde de la merde, explique mieux ton problème. Moi même je ne vois pas où il est ?! Enfin je ne comprend pas du tout ce que tu demande !
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
28 nov. 2004 à 18:03
Merci bcp a vous tous!! Merci vecchio, j'ai trouvé ce que je voulais ^^ :-)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 nov. 2004 à 18:39
Il a l'air gentil minet03!
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
28 nov. 2004 à 18:56
on me reproche quelque chose ? Si oui j'aimerai bien savoir.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 nov. 2004 à 19:21
non en fait c'est juste pouravoir un commentaire de plus (ensuite, on le respecteras plus...)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 nov. 2004 à 19:29
minet03> J'avais trouvé ton dernier message un peu agressif, je me suis trompé?
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
28 nov. 2004 à 20:10
non c'est vrai, dsl j'ai un peu les nerfs aujourd'hui.
Et c'est vrai que je n'ai pas compris le topic, la question est mal posé pour moi
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
28 nov. 2004 à 20:55
Bon, ben si la question est mal posée, je vais plutot mettre le code! J'ai trouvé une solution à mon pb : WSAAsyncSelect()..mais cela ne marche que partiellement :

/* code server */
#include <windows.h>

#define WM_SOCKET 6005

SOCKET sock;
SOCKADDR_IN addr;
int size;

HINSTANCE hInst;
HWND hMainDlg;

char buffer[MAX_PATH];

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    
  switch(message) {
    
    case WM_CREATE:
        
      bind(sock, (SOCKADDR*) &addr, sizeof(addr));
      listen(sock, 50);       
     break;
     
    case WM_SOCKET:
       
       listen(sock, 50);
         
       switch(LOWORD(lParam)) {
         
          case FD_CONNECT:
             
            size = sizeof(addr); 
            accept(sock, (SOCKADDR*) &addr, &size);
            
            MessageBox(0, "Connexion acceptée", ":)", MB_OK);      
           break;
           
          case FD_READ:
          
            recv(sock, buffer, MAX_PATH, 0);
            MessageBox(0, buffer, "buffer!", MB_OK);
           break;
           
          default:
             
            MessageBox(0, "Autre activité socket détectée", "??", MB_OK);
           break;                                                                                                                                                                                                                                                                                                                  
         }    
      break;                
     
    default:
     
      return DefWindowProc(hWnd, message, wParam, lParam);
     break;                                    
   }
                       
 }
   

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  hInst = hInstance;
 
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,0), &wsa);
  
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_port = htons(4010);
  
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
  WNDCLASSEX wc;
  MSG msg;
  
  wc.style = 0;
  wc.hInstance = hInst;
  wc.lpfnWndProc = WindowProcedure;
  
  wc.cbSize = sizeof(WNDCLASSEX);  wc.cbClsExtra wc.cbWndExtra 0;
    wc.hIcon wc.hIconSm LoadIcon(0, IDI_APPLICATION);
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  wc.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);
  
  wc.lpszClassName = "lol";
  wc.lpszMenuName = 0;
  
  RegisterClassEx(&wc);
  
  HWND hWnd;
  hWnd = CreateWindow("lol", "koala", WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        HWND_DESKTOP, 0, hInst, 0);
                        
  ShowWindow(hWnd, SW_HIDE);
  WSAAsyncSelect(sock, hWnd, WM_SOCKET, FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE);
  
  while (GetMessage(&msg, 0, 0, 0)) {
      
      TranslateMessage(&msg);
      DispatchMessage(&msg);           
     }    
   
  return msg.wParam;                                                                                                                                                                                                                                                                   
 }


Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
28 nov. 2004 à 20:57
En fait, qd mon client se connecte, j'arrive dans le cas ou lParam vaut le cas par défaut, allez savoir pk ! Et ensuite, même si le client se reconnecter ou envoie des données, je n'ai plu aucun messege :((

Une idée ?

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
28 nov. 2004 à 21:12
dsl, je ne fais pas le win32 :-D
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 nov. 2004 à 21:14
si t'avais dit que t'étais sous win, j'aurais déja laissé tombé....

tu vois, la question était effectivement mal posée...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 nov. 2004 à 21:25
Salut,
Gendal67: le socket sock est le socket qui écoute dans ton serveur, donc il ne generera jamais un event FD_CONNECT, FD_READ ou FD_WRITE.
De plus, tu passes FD_ACCEPT a WSAAsyncSelect() et lors du traitement du message WM_SOCKET tu ne traite pas la notification FD_ACCEPT mais FD_CONNECT (que tu ne recevra jamais ...).
Dans le traitement du FD_CONNECT, tu appeles accept() qui te retourne le socket handle de la connexion cliente (c'est sur ce socket que tu dois faire tes send/recv pour communiquer avec le client).

Avant de s'attaquer aux modeles 'evolués' de winsock, il faudrait d'abord maitriser les sockets bloquants un minimum.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
28 nov. 2004 à 22:48
Bon, d'accord pr le FD_CONNECT mais je call pas pk je ne peux pas recevoir des messages de type FD_READ ou FD_WRITE ? Comment je peux faire alors pr ke le server sache qu'on lui a envoyer du data ?

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 nov. 2004 à 23:03
Salut,
En fait un socket créé par accept() hérite du mode/options du socket qui écoute, c'est a dire qu'il sera non bloquant et qu'il recevra les meme notifications. Donc c'est vrai que tu peux mettre directement FD_READ et FD_WRITE sur le socket qui écoute (mais perso je trouve qu'appeler WSAAsyncSelect() pour chaque socket est plus propre).

Mais ce qui est important ici c'est que c'est le socket retourné par accept() qui generera FD_READ et FD_WRITE, pas celui qui écoute.
0
Rejoignez-nous