Accueil > Forum > > > > Multiples messages non reçus...:((
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
|
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
|
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
|
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
|
Salut, FD_READ, FD_CLOSE etc. sont des flags, donc pour les tester ont fait: if(Network.lNetworkEvent & FD_READ) { ... }
|
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|