WSAWaitForMultipleEvents vergisst Events

Bobbin

Grünschnabel
Hallo,

ich habe einen kleinen Server gebastelt, der Daten empfängt und sendet. Kommen die Pakete kurz hintereinander (2 ms), wird das zuspätgekommene Paket vergessen.

Dazu hab ich mal ein kurzes compilefähiges Codestückchen gebastelt. Die langen Sleepzeiten kommen daher, dass kurze nicht gehen :( Also zumindest bei mir vergisst er 4 Events.

Code:
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

bool bRunning = true;

#define ARRAYSIZE 10
WSAEVENT EventArray[ARRAYSIZE];

void receiver (void) {
	signed long dwWait = 0;
	while (bRunning) {
		dwWait = WSAWaitForMultipleEvents(ARRAYSIZE, EventArray, FALSE, WSA_INFINITE, FALSE);
		WSAResetEvent(EventArray[dwWait - WSA_WAIT_EVENT_0]);

		if (bRunning)
			printf(" %d catched\n",dwWait);
		Sleep(20);

	}
    ExitThread(0);
}

int main(int argc, char* argv[])
{
	// WSA anstarten
	
	WSADATA wsaData;
	if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
		fprintf(stderr,"WSAStartup failed with error %d\n",WSAGetLastError());WSACleanup();return -1;
	}

	// Events erzeugen, zurücksetzen

	for (int i = 0; i < ARRAYSIZE; i ++) {
		EventArray[i] = WSACreateEvent();
		WSAResetEvent(EventArray[i]);
	}

	// Thread starten, abwarten

	unsigned long tid;
    CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) receiver, NULL, 0, &tid );
	Sleep(10);

	// Events der Reihe nach setzen

	for(int j = 0; j < ARRAYSIZE; j++) {
		printf("Set %d ...",j);
		WSASetEvent(EventArray[j]);
		Sleep(10);
	}
	Sleep(10);

	// Receiver beenden

	bRunning = false;
	SetEvent(EventArray[1]);

	WSACleanup();
	char c;
	printf("\n\npress any key\n");
	int y = scanf("%c", &c);
	return(0);
}

Kann mir jemand sagen, wie ich alle Events bekomme?

Danke - Gruß Bobbin.
 
Zurück