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

Résolu
Signaler
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
C'est un ebook, que tu peux télécharger.
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
j'ai un exemple sous nux si ça t'intyeresse...
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
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!! :-))
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
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
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
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 !
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
Merci bcp a vous tous!! Merci vecchio, j'ai trouvé ce que je voulais ^^ :-)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Il a l'air gentil minet03!
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
on me reproche quelque chose ? Si oui j'aimerai bien savoir.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
non en fait c'est juste pouravoir un commentaire de plus (ensuite, on le respecteras plus...)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
minet03> J'avais trouvé ton dernier message un peu agressif, je me suis trompé?
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
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
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
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!! :-))
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
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!! :-))
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
dsl, je ne fais pas le win32 :-D
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
si t'avais dit que t'étais sous win, j'aurais déja laissé tombé....

tu vois, la question était effectivement mal posée...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
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!! :-))
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.