04. november 2008 - 21:04Der er
16 kommentarer og 1 løsning
Problemer med socket
Jeg har lavet et program der skal sende nolge objecter til et andet program.
Derfor bruger jeg Serialize på de objecter der skal sendes og åbner en socket. Jeg laver så hver object om til en "pakke" der ser ud på denne måde: [1 byte ] - typen af object [3 bytes] - længede på object [X bytes] - object
det hele sender jeg så med socket_name.Send(MyBytes)
programmet i den anden ende henter så pakken på denne måde: Hent de første 4 bytes find type ved hjælpe af første byte find længde ved hjælp af de 3 næste bytes Hent [længde] antal bytes og lav dem til et object
Det plejer at køre fint, men nogen gange er det som om at ikke alle bytes når frem. Jeg får nogen gange 255 i første byte og jeg har kun 13 forskellige pakke typer. Det er forskelligt hvilket pakke der fejler og nogen gange fejler ingen.
Grunden må vel være at nogen pakker smelter sammen, forstår bare ikke hvordan det kan ske?
Serveren kører hver client i en tråd for sig selv og jeg er rimlig sikker på at problemet ligger i modtagelsen.
Har en klasse kladet Packet den indeholder: enum NetworkTypes NetworkTypes type; byte[] data; public byte[] GetBytes() { byte[] toSend = new byte[data.Length + 4];
Har så en metode til at sende en pakke: public bool Send(Packet packet) { try { byte[] bytesToSend = packet.GetBytes(); clientSocket.SendBufferSize = bytesToSend.Length; clientSocket.Send(bytesToSend); } catch (SocketException) { return false; }
return true; }
Og modtage: public static bool RecivePacket(Socket s, out NetworkTypes type, out byte[] data) { byte[] header; int dataSize;
try { header = new byte[4]; s.ReceiveBufferSize = 4; s.Receive(header); type = (Packet.NetworkTypes)header[0]; dataSize = Packet.SizeToInt(header, 1); } catch (SocketException) { type = NetworkTypes.Error; data = new byte[0];
return false; }
try { if (dataSize > 0) { data = new byte[dataSize]; s.ReceiveBufferSize = dataSize; s.Receive(data); } else data = new byte[0];
return true; } catch (SocketException) { data = new byte[0];
Jah det r også noget alla det jeg får. Jeg kunne self. ta checksum og gensende ved fejl, men vil gerne vide hvorfor det går galt? jeg troede at TCP protokollen sikrede at mine pakker kom frem?
Nej - min erfaring er at TCP er reliable som den skal være.
Men den manglende while løkke i forbindelse med receive ses ofte. Det er ikke specielt naturligt i mange situationer. Men har man haft problemet engang, så husker man det fremover.
Men derfor er problemet alligevel velkendt. Ikke kun i .NET - det ses også i C, Python etc..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.