Omdat het vorige topic eigenlijk vooral over "hoe een server te bouwen" ging en ook een beetje dood was gegaan, open ik even een nieuw topic, omdat ik even een flink probleem heb met WSAEventSelect() en WSAWaitForMultipleEvents()
Er zal een lap text komen, want er is veel informatie nodig. Misschien, dus ik zal mijn vraag even helemaal onderaan de post zetten als een soort conclusie
Goed ik heb een functie die in pseudocode er zo uit ziet:
Pseudo
De output zou moeten zijn, als je twee clients toevoegd en daarna met de eerste iets stuurd:
output
alleen nu is hij:
output
dit is de code die ik er voor had:
functie run (is threaded)
het gaat op de volgende regel fout:
want als ik :
Hij zet de "last event code" op 0 (of de event zelf, want dat snap ik dus niet)
hier even een snel lijstje:
Mijn vraag is dus:
waarom zet hij de event voor WSAWaitForMultipleEvents op 0 en triggered hij hem (dus de dubbele FD_READ|FD_CLOSE)? en hoe kan ik het oplossen?
Er zal een lap text komen, want er is veel informatie nodig. Misschien, dus ik zal mijn vraag even helemaal onderaan de post zetten als een soort conclusie
offtopic:
Ik denk dat andere users die hier mee (gaan) werken ook wel wat aan hebben want ik kwam op de MSDN na erg weinig tegen over events op het net en GoT
Ik denk dat andere users die hier mee (gaan) werken ook wel wat aan hebben want ik kwam op de MSDN na erg weinig tegen over events op het net en GoT
Goed ik heb een functie die in pseudocode er zo uit ziet:
Pseudo
code:
1
2
3
4
5
6
| Maar array met events Check events Wacht op een van de events Kijk wat de laatste was Voer de event uit Herhaal |
De output zou moeten zijn, als je twee clients toevoegd en daarna met de eerste iets stuurd:
output
code:
1
2
3
4
| Starting server waiting....adding client 1 waiting....adding client 2 waiting...reading from client 1 |
alleen nu is hij:
output
code:
1
2
3
4
5
6
| Starting server waiting....adding client 1 waiting....not implemented 0 waiting...not implemented 0 waiting...not implemented 0 // adding a client waiting...not implemented 0 |
dit is de code die ik er voor had:
functie run (is threaded)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
| DWORD CClientManager::Run(LPVOID arg) { WSAEVENT *clientEvent = (WSAEVENT*)malloc((socketCount+1)*sizeof(WSAEVENT)); for (int i = 0; i < socketCount+1;i++) { clientEvent[i] = WSACreateEvent(); } while (1) { printf ("Event: "); for (int i=0; i < socketCount; i++) { switch (tempEvent[i]) { case FD_ACCEPT: if(WSAEventSelect(hostSocket, clientEvent[socketCount], FD_ACCEPT) !=0) printf("error(accepting)..."); break; case FD_READ: if(WSAEventSelect(clientSocket[i], clientEvent[i], FD_READ|FD_CLOSE) !=0) printf("error(readin)..."); break; case FD_CLOSE: if(WSAEventSelect(clientSocket[i], clientEvent[i], FD_CLOSE) !=0) printf("error(closing)"); break; case FD_WRITE: if(WSAEventSelect(clientSocket[i], clientEvent[i], FD_WRITE) !=0) printf("error(writing).."); break; default: if(!WSAResetEvent(clientEvent[i])) printf("error (reseting)..."); } } printf ("waiting..."); DWORD swResult = WSAWaitForMultipleEvents(socketCount+1, clientEvent, false, INFINITE, false); int tempEventIndex = swResult - WSA_WAIT_EVENT_0; WSANETWORKEVENTS lpNetworkEvents = {0}; if (tempEventIndex < (socketCount-1)) WSAEnumNetworkEvents(clientSocket[tempEventIndex-1],clientEvent[tempEventIndex-1],&lpNetworkEvents); else WSAEnumNetworkEvents(hostSocket,clientEvent[socketCount],&lpNetworkEvents); printf ("ne is: %d...",lpNetworkEvents.lNetworkEvents); int j = 0; switch (lpNetworkEvents.lNetworkEvents) { case FD_ACCEPT: { for (; j < socketCount; j++) { if(tempEvent[j] == FD_ACCEPT) break; } struct sockaddr sinTemp = {0}; int sinTempLength = sizeof (sinTemp); if ((clientSocket[j] = accept (hostSocket, &sinTemp, &sinTempLength)) == INVALID_SOCKET) printf("Invalid Client. Error: %d\n", WSAGetLastError()); else printf("Accepted new user\n"); tempEvent[j] = FD_READ; } break; case FD_READ: printf("Reading\n"); break; case FD_CLOSE: printf("Closing\n"); break; case FD_WRITE: printf("Writing\n"); break; case 0: printf("crapping 0\n"); Sleep(1000); break; default: printf ("no implemented action\n"); } WSAResetEvent(clientEvent[j]); } closesocket(hostSocket); free (clientEvent); return 0; } |
het gaat op de volgende regel fout:
C:
1
| if(WSAEventSelect(clientSocket[i], clientEvent[i], FD_READ|FD_CLOSE) !=0) |
want als ik :
C:
1
| if(WSAEventSelect(clientSocket[i], clientEvent[i], FD_READ) !=0) |
Hij zet de "last event code" op 0 (of de event zelf, want dat snap ik dus niet)
hier even een snel lijstje:
code:
1
2
3
4
5
6
7
8
| Code Soort Betekenis 1 Network_event FD_READ 32 Network_event FD_CLOSE 8 Network_event FD_ACCEPT 16 Network_event FD_CONNECT 2 Network_event FD_WRITE 4 Network_event FD_OOB -1 Socket error INVALID_SOCKET |
Mijn vraag is dus:
waarom zet hij de event voor WSAWaitForMultipleEvents op 0 en triggered hij hem (dus de dubbele FD_READ|FD_CLOSE)? en hoe kan ik het oplossen?