Hallo,
Ik ben een programma aan het maken wat een web-pagina inleest, data eruit haalt en de boel verwerkt. Ik maak geen gebruik van MFC, puur Win32 API. Nu komt er allemaal data binnen via FD_READ, dat lees ik en stop ik in een file. Er komt ook een FD_CLOSE binnen als alle data is ontvangen.
Het probleem is dat ik een FD_CLOSE ontvang, de socket sluit... maar dat er vervolgens nog een paar FD_READ messages binnen komen.
Nu heb ik geprobeerd om niet de socket te sluiten maar te wachten totdat er aan deze voorwaarde wordt voldaan:
Dat gebeurt dus niet omdat de socket niet wordt gesloten tijdens het lezen (gok ik).
Ik heb ook geprobeerd om als de FD_CLOSE wordt aangeroepen alle data wat nog ontvangen moet worden binnen te halen. Maar dan heb ik een probleem dat er vervolgens weer een paar FD_READ messages worden afgehandeld, dat probleem is te verhelpen om een boolean waarde te zetten bSocketClosed, maar ik denk dat dat niet helemaal juist is.
Ik weet niet precies wat nou een goede oplossing is. Het probleem is dat het niet lukt om alle data te ontvangen, en wanneer dat gelukt is de socket en file-handle te sluiten.
Ik hoop dat het duidelijk genoeg is,
Peter.
Ik ben een programma aan het maken wat een web-pagina inleest, data eruit haalt en de boel verwerkt. Ik maak geen gebruik van MFC, puur Win32 API. Nu komt er allemaal data binnen via FD_READ, dat lees ik en stop ik in een file. Er komt ook een FD_CLOSE binnen als alle data is ontvangen.
Het probleem is dat ik een FD_CLOSE ontvang, de socket sluit... maar dat er vervolgens nog een paar FD_READ messages binnen komen.
C++:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| /** * WSAAsyncSelect, er komt een bericht binnen van de socket. */ case CM_READ_SOCKET: { switch(lParam) { case FD_READ: { if(recFlag & FLAG_OVERVIEW) { char szData[512]; DWORD dwBytesWritten; int ret = recv(hSocket, szData, sizeof(szData), 0); if(ret == SOCKET_ERROR) { ret = WSAGetLastError(); if(ret == WSAEWOULDBLOCK) return 0; // Gewoon doorgaan. sprintf(szBuffer, "Fout tijdens het ontvangen van data!\nFout code: %i", ret); MessageBox(hWnd, szBuffer, "Fout!", MB_OK); return 0; } else if(ret == 0) { recFlag = recFlag & (~FLAG_OVERVIEW); CloseHandle(receivedData); return 0; } szData[ret] = 0; SetFilePointer(receivedData, 0, NULL, FILE_END); WriteFile(receivedData, szData, strlen(szData), &dwBytesWritten, NULL); } if(recFlag & FLAG_PRODUCTION) { char szData[512]; DWORD dwBytesWritten; int ret = recv(hSocket, szData, sizeof(szData), 0); if(ret == SOCKET_ERROR) { ret = WSAGetLastError(); if(ret == WSAEWOULDBLOCK) return 0; // Gewoon doorgaan. sprintf(szBuffer, "Fout tijdens het ontvangen van data!\nFout code: %i", ret); MessageBox(hWnd, szBuffer, "Fout!", MB_OK); return 0; } else if(ret == 0) { recFlag = recFlag & (~FLAG_PRODUCTION); CloseHandle(receivedData); return 0; } szData[ret] = 0; SetFilePointer(receivedData, 0, NULL, FILE_END); WriteFile(receivedData, szData, strlen(szData), &dwBytesWritten, NULL); } }break; case FD_CLOSE: { closesocket(hSocket); }break; } }break; |
Nu heb ik geprobeerd om niet de socket te sluiten maar te wachten totdat er aan deze voorwaarde wordt voldaan:
C++:
1
2
3
4
5
| else if(ret == 0) { recFlag = recFlag & (~FLAG_OVERVIEW); CloseHandle(receivedData); return 0; } |
Dat gebeurt dus niet omdat de socket niet wordt gesloten tijdens het lezen (gok ik).
Ik heb ook geprobeerd om als de FD_CLOSE wordt aangeroepen alle data wat nog ontvangen moet worden binnen te halen. Maar dan heb ik een probleem dat er vervolgens weer een paar FD_READ messages worden afgehandeld, dat probleem is te verhelpen om een boolean waarde te zetten bSocketClosed, maar ik denk dat dat niet helemaal juist is.
Ik weet niet precies wat nou een goede oplossing is. Het probleem is dat het niet lukt om alle data te ontvangen, en wanneer dat gelukt is de socket en file-handle te sluiten.
Ik hoop dat het duidelijk genoeg is,
Peter.