Ja ja, altijd fijn als iets niet werkt zoals het volgens de documentatie zou moeten
Voor netwerkfunctionaliteit in een spel maak ik gebruik van UDP sockets. UDP is een message based protocol (itt TCP wat stream based is), en dus is er geen fysieke connectie. Als je een packet stuurt gaat het gewoon de wijde wereld in, of de andere kant nu luisterd of niet. Ten minste, dit zou vziw de bedoeling moeten zijn.
Wat is het probleem nu? Ik heb een lees-thread die wacht op een event dat aangeeft of er data binnen is. Die event wordt geselecteerd met WSAEventSelect (sock, event, FD_READ). Ik wacht erop met WaitForMultipleObjects (). Dit gaat allemaal heel leuk en aardig, maar als ik de client afsluit zonder netjes een berichtje te sturen dat hij stopt, en ik stuur een berichtje van de server naar de client (die dus dan niet meer luistert), dan wordt de event getriggered aan de server kant. De socket zegt vervolgens dat er 1 byte in de leesbuffer staat. Als ik die probeer uit te lezen dan krijg ik een SOCKET_ERROR met als errorcode WSACONNRESET.
Imho zou dat helemaal niet moeten gebeuren, het is tenslotte een connectionless socket. Hoe weet de serverkant dan in hemelsnaam dat de client z'n socket gesloten heeft? Ik heb met een packetsniffer gekeken, en er komt geen pakketje terug van de client. Hoe kan de server dat dan in hemelsnaam weten
Ik heb geprobeerd ook de event te laten triggeren op FD_CLOSE, maar dat gebeurt verder niet (zoals ook zou moeten). Maar ik vind het gewoon wazig dat er 1 byte in de leesbuffer komt te staan zodra je een sendto () doet, die je niet eens uit kan lezen omdat je dan een error terug krijgt.
Ik heb het nu opgelost door op die error te checken, maar toch vind ik het wazig. Is dit normaal?
Voor netwerkfunctionaliteit in een spel maak ik gebruik van UDP sockets. UDP is een message based protocol (itt TCP wat stream based is), en dus is er geen fysieke connectie. Als je een packet stuurt gaat het gewoon de wijde wereld in, of de andere kant nu luisterd of niet. Ten minste, dit zou vziw de bedoeling moeten zijn.
Wat is het probleem nu? Ik heb een lees-thread die wacht op een event dat aangeeft of er data binnen is. Die event wordt geselecteerd met WSAEventSelect (sock, event, FD_READ). Ik wacht erop met WaitForMultipleObjects (). Dit gaat allemaal heel leuk en aardig, maar als ik de client afsluit zonder netjes een berichtje te sturen dat hij stopt, en ik stuur een berichtje van de server naar de client (die dus dan niet meer luistert), dan wordt de event getriggered aan de server kant. De socket zegt vervolgens dat er 1 byte in de leesbuffer staat. Als ik die probeer uit te lezen dan krijg ik een SOCKET_ERROR met als errorcode WSACONNRESET.
Imho zou dat helemaal niet moeten gebeuren, het is tenslotte een connectionless socket. Hoe weet de serverkant dan in hemelsnaam dat de client z'n socket gesloten heeft? Ik heb met een packetsniffer gekeken, en er komt geen pakketje terug van de client. Hoe kan de server dat dan in hemelsnaam weten
Ik heb geprobeerd ook de event te laten triggeren op FD_CLOSE, maar dat gebeurt verder niet (zoals ook zou moeten). Maar ik vind het gewoon wazig dat er 1 byte in de leesbuffer komt te staan zodra je een sendto () doet, die je niet eens uit kan lezen omdat je dan een error terug krijgt.
Ik heb het nu opgelost door op die error te checken, maar toch vind ik het wazig. Is dit normaal?
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.