begin process at 2012 05 29 13:00:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Multiples messages non reçus...:((


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Multiples messages non reçus...:((

vendredi 14 janvier 2005 à 21:37:41 | Multiples messages non reçus...:((

Gendal67

Bonsoir tout le monde!

Je suis actuellement en cours d'apprentissage des Sockets et j'ai crée une application Client/Server pouvant communiquer ensemble! Il n'y a pas de souci lors de la connexion etc...en fait, le client envoie 2 messages ("salut!!!", et "xpldr!!")...mais seul le premier ("salut!!!") est reçu, pas le second! En fait, le server récupère des buffers vides après des appels à recv()....comme si il n'attendais pas l'arrivée de données...:s ... j'spère que vous pourrez m'aider...et que mon code n'est pas trop tiré par les cheveux ;)

/* appli cliente */

#include <windows.h>
#include <winsock2.h>

SOCKET sock;
SOCKADDR_IN addr;

int port = 8554;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
 
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("213.44.147.196");
  addr.sin_port = htons(port);
 
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  connect(sock, (SOCKADDR*) &addr, sizeof(addr));
 
  send(sock, "Salut!!!", 15, 0);
  send(sock, "xpldr", 15, 0);
  MessageBox(0, "Voila, c'est envoyé!! :)", ":)", 0); 
 }

/* Appli server */

#include <windows.h>
#include <winsock2.h>

WSANETWORKEVENTS Network;
WSAEVENT Event[1];

SOCKET sock, dasock;
SOCKADDR_IN addr, sin;

int port = 8554;

DWORD WINAPI WaitTCPData(LPVOID pv) {
 
  char buffer[500];
  int result = SOCKET_ERROR;
 
  int TimedOut = 0;
 
  while(result == SOCKET_ERROR) {
 
   ZeroMemory(buffer, sizeof(buffer));
   result = recv(dasock, buffer, 500, 0);
   
   if(lstrlen(buffer) > 2) {
                  
     MessageBox(0, buffer, "Server a intercepé ceci :", 0);
     TimedOut = 0;
    }
   
   else TimedOut++;
  
   if(TimedOut >= 20000) return 0;
  } 
 }

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
 
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = INADDR_ANY;
 
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sock, (SOCKADDR*) &addr, sizeof(addr));
 
  Event[0] = WSACreateEvent();
  listen(sock, 5);
 
  char buffer[500]; 
  int sinsize;
 
  while(1) {
   
    sinsize = sizeof(sin);
    if((dasock = accept(sock, (SOCKADDR*) &sin, &sinsize)) != INVALID_SOCKET) {
     
      WSAEventSelect(dasock, Event[0], FD_READ);
     
      ZeroMemory(&Network, sizeof(WSANETWORKEVENTS));
      WSAWaitForMultipleEvents(1, Event, 0, WSA_INFINITE, 0);
      WSAEnumNetworkEvents(dasock, Event[0], &Network);
     
      switch(Network.lNetworkEvents) {
      
        case FD_READ:
         
          DWORD dwTemp;
          CreateThread(0, 0, WaitTCPData, (LPVOID) 0, 0, &dwTemp); 
         break;       
       } 
     }  
   }   
 }


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

vendredi 14 janvier 2005 à 21:50:02 | Re : Multiples messages non reçus...:((

Joky

Membre Club
Moi déjà j'mettrai 127.0.0.1 comme IP histoire d'être sur que tu le recevra :)
Mais sinon les socket, je connais strictement rien
Faudrait j'mi mette également
Donc si quelqu'un pouvait répondre à sa question et me filer un lien de tutorial
Je  serais votre esclave ;)
mdr
Abusé pas qd mm
Bande de proxenete

By Moi

void Aurevoir( void ); //Bonne journée

vendredi 14 janvier 2005 à 23:31:26 | Re : Multiples messages non reçus...:((

Gendal67

Non Joky, pas 127.0.0.1....le message marche avec la vraie IP, donc pas de pb...le seul souci c'est l'envoie de plusieurs messages (= +d'un appel à send())

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
vendredi 14 janvier 2005 à 23:36:29 | Re : Multiples messages non reçus...:((

aardman

Membre Club
Salut,
a quoi sert le thread WaitTCPData ?
La fonction WSAEventSelect() met automatiquement le socket dasock en mode non bloquant, donc lors du traitement du FD_READ, tu peux directement appeler recv().

Ensuite, ta boucle principale se compose comme ca:

while(1)
{
if(dasock = accept(...))
{
// traitement
}
}

A la premiere iteration, la connexion est acceptée et le traitement effectué, et dans la seconde iteration, le accept() bloque tout car sock est bloquant.
samedi 15 janvier 2005 à 00:05:23 | Re : Multiples messages non reçus...:((

Gendal67

:s oki oki..mais comment faire alors pour recevoir +d'un message FD_READ sans que ça déconne ??

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
samedi 15 janvier 2005 à 00:12:30 | Re : Multiples messages non reçus...:((

Gendal67

euh, et ça, c'est mieux ?

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
 
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = INADDR_ANY;
 
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sock, (SOCKADDR*) &addr, sizeof(addr));
 
  Event[0] = WSACreateEvent();
  listen(sock, 0);
 
  char buffer[500]; 
  int sinsize;
 
  while(1) {
   
    sinsize = sizeof(sin);
    if((dasock = accept(sock, (SOCKADDR*) &sin, &sinsize)) != INVALID_SOCKET) {
     
      WSAEventSelect(dasock, Event[0], FD_READ);
     
      ZeroMemory(&Network, sizeof(WSANETWORKEVENTS));     
     
      WSAWaitForMultipleEvents(1, Event, 0, WSA_INFINITE, 0);
      WSAEnumNetworkEvents(dasock, Event[0], &Network);
     
      switch(Network.lNetworkEvents) {
      
        case FD_READ:
         
          ZeroMemory(buffer, sizeof(buffer));
          recv(dasock, buffer, 500, 0);
         break;       
       }     
        
    }
      
      closesocket(dasock);  
     }      
 }


Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
samedi 15 janvier 2005 à 00:19:56 | Re : Multiples messages non reçus...:((

aardman

Membre Club
Salut,
Faudrait revoir la structure complete du prog, la tu as fait un mélange entre le modele WSAEventSelect, et le modele avec les sockets bloquants + threads.

Pour utiliser le modele WSAEventSelect seul, il faut appeler WSAEventSelect sur le socket sock apres l'avoir bindé, et dans ta boucle principale on doit trouver dans l'ordre: WSAWaitForMultipleEvents pour attendre qu'un event passe a l'état signalé,
puis pour chaque event signalé:
WSAEnumNetworkEvents pour savoir le type d'event (FD_READ, FD_CONNECT, etc..) et ensuite il faut traiter ces events.

Tout cela est bien mieux expliqué dans ce bouquin:
[ Lien ]
samedi 15 janvier 2005 à 09:18:38 | Re : Multiples messages non reçus...:((

Gendal67

Je l'ai déja ce livre aardman, c'est un ebook que tu m'a déja conseillé et j'en ai déja lu un pti bout....mais bon, surtout parce que c'est entièrement en anglais, je n'ai pas passé des heures à raser tout au peigne fin....nan sérieux, tu pourrais pas m'expliquer toi ? Je ne te demande pas de tout me dire ni de tout me faire mais m'expliquer certains trucs....là j'ai fait ceci, et je ne comprend pas pourquoi ça ne marche pas :

  while(1) {
   
    sinsize = sizeof(sin);
    if((dasock = accept(sock, (SOCKADDR*) &sin, &sinsize)) != INVALID_SOCKET) {
    
    do {
     
      Event[0] = WSACreateEvent();
      WSAEventSelect(dasock, Event[0], FD_READ);
     
      ZeroMemory(&Network, sizeof(WSANETWORKEVENTS));      
     
      WSAWaitForMultipleEvents(1, Event, 0, WSA_INFINITE, 0);
      WSAEnumNetworkEvents(dasock, Event[0], &Network);
     
      switch(Network.lNetworkEvents) {
      
        case FD_READ:
         
          ZeroMemory(buffer, sizeof(buffer));
          recv(dasock, buffer, 500, 0);
         
          MessageBox(0, buffer, "Message reçu sur le server :", 0);
         break;       
       } 
                          
    } while(1); // c'est juste pour tester avec plusieurs messages...
      
      closesocket(dasock);  
     }


Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
samedi 15 janvier 2005 à 10:28:20 | Re : Multiples messages non reçus...:((

Gendal67

Re-salut! J'ai regardé le book et j'ai trouvé et cru comprendre certaines choses  même si le programme ne marchent toujours pas...que dis tu de ça :

#include <windows.h>
#include <winsock2.h>

#include <stdio.h>

WSANETWORKEVENTS Network;
WSAEVENT Event[5];
SOCKET sockarray[5];

SOCKET sock, dasock;
SOCKADDR_IN addr, sin;
WSAEVENT hEvent;

int port = 8554;
int wsa_connection_cnt = 0;
int index = 0;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
 
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = INADDR_ANY;
 
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sock, (SOCKADDR*) &addr, sizeof(addr));
 
  hEvent = WSACreateEvent();
  WSAEventSelect(sock, hEvent, FD_ACCEPT | FD_CLOSE); 
 
  listen(sock, 5);
 
  sockarray[wsa_connection_cnt] = sock;
  Event[wsa_connection_cnt] = hEvent;
  wsa_connection_cnt++;
 
  char buffer[500];
  int sizesin = sizeof(sin);
 
  while(1) {
 
     index = WSAWaitForMultipleEvents(wsa_connection_cnt, Event, FALSE, WSA_INFINITE, FALSE);
     index = index - WSA_WAIT_EVENT_0;
    
     WSAEnumNetworkEvents(sockarray[index], Event[index], &Network);
    
     switch(Network.lNetworkEvents) {
     
       case FD_ACCEPT:
       
         dasock = accept(sockarray[index], (SOCKADDR*) &sin, &sizesin);
        
         hEvent = WSACreateEvent();
         WSAEventSelect(dasock, hEvent, FD_READ | FD_WRITE | FD_CLOSE);
        
         sockarray[wsa_connection_cnt] = dasock;
         Event[wsa_connection_cnt] = hEvent;
         wsa_connection_cnt++;
        
         printf("Connexion interceptee et acceptee no: %d\n", wsa_connection_cnt);
        break;
       
       case FD_READ:
        
         ZeroMemory(buffer, sizeof(buffer));
         recv(sockarray[index], buffer, 500, 0);
        
         hEvent = WSACreateEvent();
         WSAEventSelect(sockarray[index], hEvent, FD_READ | FD_WRITE | FD_CLOSE);
        
         MessageBox(0, buffer, "Server a reçu ceci :", 0);
        break;
       
       case FD_CLOSE:
           
          closesocket(sockarray[index]);
         // CompressArrays(Event, sockarray, &wsa_connection_cnt); 
         break;                   
      } 
   }        
 }

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

samedi 15 janvier 2005 à 12:47:51 | Re : Multiples messages non reçus...:((

aardman

Membre Club
Salut,
FD_READ, FD_CLOSE etc. sont des flags, donc pour les tester ont fait:
if(Network.lNetworkEvent & FD_READ)
{ ... }

1 2

Cette discussion est classée dans : int, socket, sin, sock, addr


Répondre à ce message

Sujets en rapport avec ce message

LERREUR QUI TUE §§§§§§§§§§§§§§§§ [ par Avalon10101 ] Vla jai fé mon prog tout é juste mais ya une erreur que je narrive vraiment pas à comprendre ! :C:\Documents and Settings\Alex\Mes documents\Makefile. Documentation Reseaux [ par SnowBlade360 ] Bonjour J'ai trouver sur inernet du code afin de crée une socket mais j'aimerais connaitre exactement tout les champs qui la compose voici mon code : CreateProcess sur socket [ par Stormy ] Je cherche un moyen d'associer une socket avec un CreateProcess afin de lancer un shell sur CMD. Malheureusement, je ne trouve pas de liens intéressan [C] socket [ par sheorogath ] bonjour ,j'essai de me faire une sorte de lib client dans un premier temps pour utiliser les socket mais avec mon code je ne peut me connecter null pa socket trop lents [ par cid7777777 ] bonjour,jessaye de faire un jeu qui peu se jouera 2 en reseau local.je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver téléchargement d'un fichier via l'url [WINSOCK] [ par MorbhAck ] Bonsoir tout le monde!j'ai un problème, j'essai de télécharger un fichier .rar avec GETet quand je veux extraire le rar il m'indique que le fichier es Bind echouant.. [ par lektrosonic ] Bonsoir, deux applications, bon pour etre original: serveur et client.Chacune de leur cote effectue ce code:Serveur:----------------------   if(WSASta Connexion SOCKET_ERROR [ par fredsor ] Salut a tous,Je réalise un ptit programme au sein duquel je me connecte a un serveur distant, afin de récupérer via une methode GET des informations n Winsock2 et Wifi [ par djin94 ] Bonjour,Je programme sous Visual C++ et je souhaite établir une connection UDP entre deux pc via une liaison Wifi. J'ai essayé avec Winsock2 mais ca n


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales