cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 mai 2011
-
25 juin 2004 à 14:46
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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 !
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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 !!
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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).
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 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!
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 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)
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 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 !!