Bonjour,
dans mon application cliente (win32 api C/C++) utilisant WSAAsyncSelect et FD_READ donc en non bloquant, je voulais savoir comment faire pour savoir que l'on a reçu toutes les donnees ?
mon client peut se connecter sur n'importe quel serveur, soit web, irc ou autre, je recupere des donnees bruts donc je n'ai pas d'indication que le FD_READ a terminé de lire toutes les donnees.
Le fd_read d'apres ce que j'ai compris est declenché des qu'un caractere est reçu, par exemple si le serveur renvoi "bonjour" le FD_READ se declenche lorsqu'il reçoit le b, le o, n etc.. je recupere chaque caractere dans un buffer et je l'affiche mais je ne peux pas savoir quand le FD_READ a terminé car je dois faire un traitement une fois la lecture de toutes les données terminée.
Je joint le code du FD_READ.
Avez vous une idee ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 //On read client BOOL OnClientFDRead(SOCKET& sock) { if (ClientData != NULL) //If exist clients { static int retval = 0; CDataClient::PDATA_CLIENT pCli; if ((pCli = ClientData->GetDataClientFromSocket(sock)) != NULL) //Get infos data from client to read { if (pCli->totalBytes >= ClientData->GetBufferSize()) { g_nError = TRUE; LogMessage(COLOR_RED, "Buffer of data to read is to large"); return FALSE; } unsigned char Buf[10]; pCli->totalBytes += retval; retval = recv(pCli->sock, (char *)Buf, 1, 0); //Get the text if( retval == SOCKET_ERROR) { g_nError = TRUE; LogMessageError(); return FALSE; } memcpy(&pCli->RecvBuf[pCli->totalBytes], Buf, retval); SendToLogMessage(&pCli->RecvBuf[pCli->totalBytes]); } } return TRUE; }
Partager