Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 2011
-
14 janv. 2005 à 21:37
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
17 janv. 2005 à 14:47
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) {
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 14 janv. 2005 à 21:50
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
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 14 janv. 2005 à 23:31
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())
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 14 janv. 2005 à 23:36
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:
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.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 15 janv. 2005 à 00:19
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.
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 15 janv. 2005 à 09:18
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 :
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 15 janv. 2005 à 13:17
Salut,
Ben pour le FD_ACCEPT ca a l'air d'aller, pour le FD_READ tu dois simplement appeler recv() sur le bon socket (pas besoin de créer d'event ni d'appeler WSAEventSelect, et pour FD_CLOSE il faut fermer l'event, fermer le socket, et enlever les cases vides du tableau (CompressArrays).
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 15 janv. 2005 à 13:29
ça ne marche pas...quand j'enlève les 2fct qui redéclare l'event dans le FD_READ, j'obtiens une première MessageBox() correcte, puis une suite infinie de boites vides! (donc pas le message "xpldr!!" reçu....) ... s je les laisse, je n'ai juste pas de boites vides interminables succesives mais le pb d u 2e message n'est tjs pas résolu...
Voici mon nouvo code :
while(1) {
index = WSAWaitForMultipleEvents(wsa_connection_cnt, Event, FALSE, WSA_INFINITE, FALSE);
index = index - WSA_WAIT_EVENT_0;
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 15 janv. 2005 à 13:41
Salut,
S'il y a un bug, aussi bete soit il, tu aura du mal a le trouver avec un code comme ca, il faut traiter systematiquement les erreurs de chaques fonctions, les afficher (printf ou écriture de logs dans un fichier, mais pas MessageBox qui bloque tout). le but est d'avoir un max d'info a l'écran lors de l'execution du prog pour savoir la ou ca fonctionne pas, et donc la ou il faut chercher.
cs_Nashua
Messages postés48Date d'inscriptionlundi 29 novembre 2004StatutMembreDernière intervention16 mars 2005 16 janv. 2005 à 06:53
Je ne voudrais pas trop en rajouter, mais lorsque tu ouvre une socket
TCP tu fais un bind, ensuite tu "listen " pour une connexion entrante .
Lorsque une connexion est entrante listen () delivre un fd et a ce
moment tu fais un accept(). Apres cela tu pars dans to while recvfrom()
sans jamis plus repasser en accept(). Essaie de grouper open socket,
bind,listen, accept avant de partir dans le while.
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 16 janv. 2005 à 12:28
Nashua> Merci du conseil....pourtant mon code ressemble presque à un code trouvé dans un manuel best-seller sur les sockets....donc voila, j'ai relativement suivi son plan....il s'est peut-etre gourré, c'est possible! Mais toi, comment aurais-tu fais concretement (code) ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 16 janv. 2005 à 12:50
Salut,
Pourquoi mettre accept avant le while ? Il ne sera executé qu'une fois, alors que le prog est un serveur donc on pourrait supposer qu'il faudra accepter d'autres connexions.
cs_Nashua
Messages postés48Date d'inscriptionlundi 29 novembre 2004StatutMembreDernière intervention16 mars 2005 17 janv. 2005 à 06:51
Si tu veux accepter plusieur connection l'accept() doit etre dans un
while (1) . Dans la derniere mouture du code de Gendal67 le recv
() et l'accept() sont dans une seule bopucle. Ce que je ferait :
While(1) { // mon serveur accepte plusieurs connections au plus maxconnection donne a listen()
listen( sock, maxconnection);
accept();
// Je start un thread pour traiter cette connexion.
}
my_receive_thread(){
while ( recvfrom () > 0 ){
je print le buffer recu
}
}
Desole je n'ai pas un exemple simple sous la main .
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 17 janv. 2005 à 14:47
Salut,
Nashua: ce que tu décris c'est le modele de base, c'est a dire socket bloquant + thread pour chaque connexion.
Sous windows on dispose de modeles plus évolués comme WSAAsyncSelect ou WSAEventSelect (entre autres), et il m'a semblé que Gendal67 souhaitait utiliser l'un de ces modeles.