C # TCP Simulation du serveur

J’ai une application prête à l’emploi (client) qui se connecte à un serveur via TCP, j’ai utilisé Wireshark pour voir ce qui se passe et j’ai ceci:

Le client envoie au serveur ce paquet:

|00|18|e7|96|92|13|fc|f8|ae|2b|7a|4b|08|00|45|00|00|3f|6d|d8|00|00|80|11|49|7d|c0|a8|01|07|c0|a8|01|01|c2|b3|00|35|00|2b|cc|7f|5e|fe|01|00|00|01|00|00|00|00|00|00|05|70|61|6e|65|6c|07|6d|75|66|69|62|6f|74|03|6e|65|74|00|00|01|00|01| 

Et le serveur répond avec:

 0xfc 0xf8 0xae 0x2b 0x7a 0x4b 0x00 0x18 0xe7 0x96 0x92 0x13 0x08 0x00 0x45 0x28 0x00 0x34 0x00 0x00 0x40 0x00 0x34 0x06 0x2a 0xa4 0x95 0xca 0xc4 0x7e 0xc0 0xa8 0x01 0x07 0x19 0x9b 0xde 0x39 0x18 0x24 0xd5 0x66 0x85 0xa3 0xb1 0x7b 0x80 0x12 0x72 0x10 0xc4 0x81 0x00 0x00 0x02 0x04 0x05 0xac 0x01 0x01 0x04 0x02 0x01 0x03 0x03 0x07 

Donc, mon code de serveur actuel est:

 Int32 port = 6555; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); var g1 = new byte[] { 0xfc, 0xf8, 0xae, 0x2b, 0x7a, 0x4b, 0x00, 0x18, 0xe7, 0x96, 0x92, 0x13, 0x08, 0x00, 0x45, 0x28, 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x34, 0x06, 0x2a, 0xa4, 0x95, 0xca, 0xc4, 0x7e, 0xc0, 0xa8, 0x01, 0x07, 0x19, 0x9b, 0xde, 0x39, 0x18, 0x24, 0xd5, 0x66, 0x85, 0xa3, 0xb1, 0x7b, 0x80, 0x12, 0x72, 0x10, 0xc4, 0x81, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x01, 0x04, 0x02, 0x01, 0x03, 0x03, 0x07 }; server = new TcpListener(localAddr, port); server.start(); while(true) { TcpClient client = server.AcceptTcpClient(); NetworkStream stream = client.GetStream(); while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { stream.Write(g1, 0, g1.Length); } } stream.close(); } 

Donc, chaque fois que le serveur reçoit quelque chose du client, il doit envoyer les octets g1 (c’est juste à des fins de test), mais je reçois cette erreur après la connexion du client au serveur:

 Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. 

Toute idée serait géniale, merci

Je suggère TcpClient client = server.AcceptTcpClient(); NetworkStream stream = client.GetStream(); TcpClient client = server.AcceptTcpClient(); NetworkStream stream = client.GetStream(); à l’intérieur de la boucle while. Créer un nouveau thread pour ne pas bloquer l’interface utilisateur lors de la réception du message

 private void GetMessageThread() { bool receive = true; Stream strm = client.GetStream(); while (receive) { try { IFormatter formatter = new BinaryFormatter(); ssortingng obj; if (strm.CanRead) { obj = (ssortingng)formatter.Deserialize(strm); } else { _receive = false; break; } } } } 

Dans ce cas, le BinaryFormatter sait quand il y a la fin du stream, vous n’avez donc pas à donner Bytes.Length et vous n’avez pas besoin de fermer le stream après chaque message. Vous rencontrez normalement une erreur lorsque le serveur ou le client est tombé en panne ou .Close() été appelé sur TcpListener ou TcpClient. J’espère que cela vous aidera.