Beste tweakers,
ik zit hier met een vreemd probleem. Ik heb er al wel een "ducttape fix" voor, maar een echte oplossing is wel gewenst.
De Situatie:
Ik ben een multiplayer fps game in unity aan het maken. Laatst heb ik het netwerk (zowel tcp als udp) systeem dat ik had compleet opnieuw geschreven. Dit is allemaal goed gegaan, en ik denk dat het een prima systeem is geworden.
Het Systeem:
Mijn networking is gebaseerd op classes die ik rondstuur. Voor elk soort bericht heb ik een class, die derived kan zijn van de "GenericMessage" class, de "RequestMessage" class (die weer derived is van GenericMessage) en de "ResponseMessage" class (ook derived van GenerikMessage). Wanneer ik zo'n message wil versturen haal ik hem door een BinaryFormatter heen. Nu ontstaat er een probleem met de formatters van twee verschillende assemblies, maar dat was blijkbaar op te lossen met een eigen binder.
Om een voorbeeld te geven:
De client wil een nieuwe lobby aanmaken =>
Bij sommige berichten die de client ontvangt geeft de BinaryFormatter een exception dat hij de ontvangen byte[] niet snapt. Door de ontvangen byte[]'s te loggen op de console, kwam ik erachter dat er bij de foute berichten de eerste vier bytes ontbraken.
De Ducttape:
Toen ik met breakingpoints in mijn server ging debuggen, ging het probleem weg. Ook door de byte[]'s ook op de server te loggen ging het probleem weg. Ik vind dit super vreemd. Samen met een vriend van me bedachten we dat het wellicht met timing te maken kon hebben. En wat blijkt? Door een simpele Thread.Sleep(10) (a.k.a. de ducttape) te plaatsen werkt alles ook.
Mijn Vragen:
Bij voorbaat al bedankt!
Btw: een vorig topic van mij ook over mijn game:\[C#] Organisatie van Tcp-verbindingen
het is misschien niet zo relevant meer, maar misschien wel handig om erbij te hebben
ik zit hier met een vreemd probleem. Ik heb er al wel een "ducttape fix" voor, maar een echte oplossing is wel gewenst.
De Situatie:
Ik ben een multiplayer fps game in unity aan het maken. Laatst heb ik het netwerk (zowel tcp als udp) systeem dat ik had compleet opnieuw geschreven. Dit is allemaal goed gegaan, en ik denk dat het een prima systeem is geworden.
Het Systeem:
Mijn networking is gebaseerd op classes die ik rondstuur. Voor elk soort bericht heb ik een class, die derived kan zijn van de "GenericMessage" class, de "RequestMessage" class (die weer derived is van GenericMessage) en de "ResponseMessage" class (ook derived van GenerikMessage). Wanneer ik zo'n message wil versturen haal ik hem door een BinaryFormatter heen. Nu ontstaat er een probleem met de formatters van twee verschillende assemblies, maar dat was blijkbaar op te lossen met een eigen binder.
Om een voorbeeld te geven:
De client wil een nieuwe lobby aanmaken =>
- De client stuurt een CreateLobbyRequest met daarin een voorstel voor een naam (met misschien later nog een wachtwoord mogelijkheid).
- De server bepaald of dit kan en stuurt een CreateLobbyResponse met daarin het nieuwe lobby nummer als de request geaccepteerd is. (op elke request moet een response worden gestuurd)
- De server stuurt aan elke connected client een CreateLobbyMessage met daarin alles wat de client moet weten over de nieuwe lobby.
Bij sommige berichten die de client ontvangt geeft de BinaryFormatter een exception dat hij de ontvangen byte[] niet snapt. Door de ontvangen byte[]'s te loggen op de console, kwam ik erachter dat er bij de foute berichten de eerste vier bytes ontbraken.
De Ducttape:
Toen ik met breakingpoints in mijn server ging debuggen, ging het probleem weg. Ook door de byte[]'s ook op de server te loggen ging het probleem weg. Ik vind dit super vreemd. Samen met een vriend van me bedachten we dat het wellicht met timing te maken kon hebben. En wat blijkt? Door een simpele Thread.Sleep(10) (a.k.a. de ducttape) te plaatsen werkt alles ook.
Mijn Vragen:
- Hoe kan het dat als ik meerdere tcp-berichten achter elkaar verstuur, dat er dan bytes verloren gaan?
- Hoezo heeft timing daar effect op?
- En weet iemand een manier om dit op te lossen?
Bij voorbaat al bedankt!
Btw: een vorig topic van mij ook over mijn game:\[C#] Organisatie van Tcp-verbindingen
het is misschien niet zo relevant meer, maar misschien wel handig om erbij te hebben
