Pb WSAWaitForMultipleEvents

cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011 - 25 juin 2004 à 14:46
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011 - 28 juin 2004 à 13:33
Bonjour,

J'ai quelques pb avec le WSAWaitForMultipleEvents(...)
En fait, je developpe un client serveur qui communique par des sockets en C++.
Je créé un thread qui se charge de la reception, et qui va attendre que des données lui arrive.
Pour cela, je fais:

WSAEVENT hEventObject;
hEventObject = WSACreateEvent();
// on lie l'EVENT au socket s
if (SOCKET_ERROR == WSAEventSelect(stl->sock, hEventObject, FD_READ)){
lastError = WSA_SELECT_ERROR;
}
// on attend l'EVENT. --- c'est là que ça plante
if (WSA_WAIT_FAILED == WSAWaitForMultipleEvents(1, &hEventObject, FALSE, WSA_INFINITE, FALSE)){
cout<<"verifions l'erreur\n";
lastError = WSA_WAIT_ERROR;
}

Le pb est que ça plante à l'execution (pas a la compil) sur WSAWaitForMultipleEvents et je ne comprend pas pourkoi.
j'ai un message qui me dit "la memoire ne peut pas etre 'written'..."
La socket est valide, je l'ai testée.
Le message ne s'affiche même pas !

(Juste pour info: WSA_WAIT_ERROR et WSA_SELECT_ERROR sont des #define que g defini dans mon .h, pas de soucis !!).

Est ce que ceci serait dejà arrivé a quelqu'un ?????
merci bcp !

Valoue

15 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2004 à 15:17
dixit MSDN pour ton hEventObject:
Pointer to an array of event object handles !!!

Un tableau et on passe son nom (le pointeur donc).

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
25 juin 2004 à 15:29
Oooohhhhhh, merci bcp !!!
Tu me sauve !
Je pensais que ça n'etait pas obligatoire !!!!!
Merci merci merci !!!

Valoue
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
25 juin 2004 à 16:14
Desolée de t'embeter encore, mais j'ai toujours la meme erreur.
J'ai fait:
WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
EventArray[0] = WSACreateEvent();
// on lie l'EVENT au socket s
if (SOCKET_ERROR == WSAEventSelect(stl->sock, EventArray[0], FD_READ)){
lastError = WSA_SELECT_ERROR;
}
// on attend l'EVENT.
if (WSA_WAIT_FAILED == WSAWaitForMultipleEvents(1, EventArray, FALSE, WSA_INFINITE, FALSE)){
lastError = WSA_WAIT_ERROR;
}

L'erreur est toujours sur le WSAWaitForMultipleEvents.
pourrais tu me dire si ce que g fais est juste stp ??
merci !!

Valoue
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2004 à 16:21
EventArray a passer et non la valeur EventArray[0].

ciao...
BruNews, Admin CS, MVP Visual C++
0

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

Posez votre question
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
25 juin 2004 à 16:30
merci,
g fais ce que tu m'as dit mais il me dit que:
le descripteur que je donne (le socket) n'est pas un socket !
Pouratnt, sa valeur est bonne je ne comprends pas, et il est de type SOCKET !!!

Saurais tu pourkoi ? As tu dejà eu cette erreur ??
Valoue
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2004 à 16:45
Verifie par rapport a l'exemple de MSDN, il y en a un complet sur WSAWaitForMultipleEvents.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
25 juin 2004 à 16:52
Ouai, mais là moi je suis du coté du client qui veut recevoir la reponse du serveur.

Sur le MSDN, ils semblent être coté serveur (puisqu'ils font un accept).Il faut avoir fait obligatoirement un accept ?? si oui, ça veut dire que je ne peux pas le faire pour le client alors ?

C'est peut etre pour cela qu'il me dit que mon socket n'est pas un bon descripteur.
Tu sais toi ?

Il me dit cette erreur pour le WSAEventSelect (erreur 10038).
D'ailleurs si le MSDN, ils n'utilisent pas WSAEventSelect. Je crois qu'ils l'ont remplacé par l'appel de ZoneMemory(...), une fonction a eux (il me semble).

Valoue
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
25 juin 2004 à 18:10
Salut,
L'erreur est avant WSAEventSelect, verifie si la fonction socket te retourne un socket valide et si la fonction connect établis correctement la connexion.

ps à BruNews: toujours fidele au poste à ce que je vois!
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2004 à 18:28
ben ça fait un moment qu'on ne t'avait point vu, priere de revenir un peu plus souvent.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
28 juin 2004 à 10:41
Merci de m'avoir repondu a tous les 2.
Le socket que j'utilise est bien bon.
LE connect se fait bien parce que je fais un send juste avant.
En fait j'utilise ceci afin de recupérer l'acquittement que le serveur envoie au client apres que le client ait envoyé son message.
Il me dit que c'est une erreur 10038 (c'est à dire Descripteur (1er champs) n'est pas un Socket) alors que stl->sock est de type SOCKET !!
J'ai bien de droit d'utiliser le FD_READ avec WSAEventSelect, hein ?? je ne vois pas pourkoi je n'aurais pas le droit !!

voilà deux jours que je suis bloquée sur le même erreur, c crispant !!!!
Merci de votre aide !
Valoue
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
28 juin 2004 à 11:24
Salut,
Poste le bout de code ici, ca sera plus facile pour trouver la trouver.

note: normalement on appele WSAEventSelect() avant tout appel de send et connect (on recupere l'evenement connexion avec FD_CONNECT).
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
28 juin 2004 à 11:26
dans le message d'avant, je voulais biensur dire: pour trouver l'erreur.
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
28 juin 2004 à 12:03
En fait le code qui suit se trouve dans une procedure qui est executée par le thread:

static DWORD WINAPI recoit(LPVOID sote){
..... declarations..... je ne les mets pas pour alleger le code ...
/*L'objectif est ici d'eviter de faire des sockets bloquante */
//creation d'un evenement pour detecter l'envoie de données de la part du serveur
EventArray[nbEvent] = WSACreateEvent();
nbEvent++;
if (stl->sock == SOCKET_ERROR){
cout<<"erreur de socket";
}
// on lie l'EVENT au socket s
//le pb est là .......................................
if (SOCKET_ERROR == WSAEventSelect(stl->sock, EventArray, FD_READ)){
lastError = WSA_SELECT_ERROR;
cout<<WSAGetLastError();
}
// on attend l'EVENT.
if (WSA_WAIT_FAILED == WSAWaitForMultipleEvents(1, EventArray, FALSE, WSA_INFINITE, FALSE)){
lastError = WSA_WAIT_ERROR;
}
if ((len = recv(stl->sock, data, sizeof(data), 0)) != SOCKET_ERROR){
lastError = RECEPTION_ERROR;
} else {
cout<<"ici4";
stl->text = (char*)malloc(sizeof(data));
strcpy(stl->text,data);
((LPTHREAD_PARAMS *)sote)->sock = stl->sock;
((LPTHREAD_PARAMS *)sote)->text = stl->text;
st.sock = stl->sock;
st.text = stl->text;
}
}

stl est de type:
typedef struct socketEtText{
SOCKET sock;
char* text;
}*THREAD_PARAMS, LPTHREAD_PARAMS;

l connect est fait dans une methode "ouvertureClient" qui fait le connect et recupère le socket
Valoue
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
28 juin 2004 à 12:26
Salut,
WSAEventSelect() prend en 2eme param un WSAEVENT alors que tu lui passes un pointeur sur le tableau d'event.
ca devrait plutot etre:
WSAEventSelect(stl->sock, EventArray[nbEvent], FD_READ)
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
28 juin 2004 à 13:33
merci bcp, je n'ai maintenant plus d'erreur sur le WSAEventSelect.
c'est bon, l'erreur n'y est plus !!
J'av ejà essayé ceci mais l'erreur restait ! en fait elle etait plus loin !!

Merci a tous les deux de votre aide c tres gentil !!

@+ !
Valoue
0