Seltsames Verhalten von Socket

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Seltsames Verhalten von Socket

    Hey Leute,

    Heute ist mir ein Seltsames Verhalten der Socket Klasse vorgekommen.

    Beim versuch Daten per Socket.Send() und Socket.Receive() durchs Internet zu schicken, gingen plötzlich Bytes verloren, z.B. von etwas über 21 Tausend Bytes ging eine komplett zufällige Anzahl verloren. Nachdem ich dann Wireshark aktiviert habe, sah ich, dass doch alle Daten angekommen waren. Nun habe ich folgendes Konstrukt:

    C#-Quellcode

    1. private int ReceiveData(out byte[] Message)
    2. {
    3. try
    4. {
    5. byte[] ReadBuffer = new byte[4] { 0xFF, 0xFF, 0xFF, 0xFF };
    6. ClientS.Receive(ReadBuffer, 4, SocketFlags.None);
    7. int size = BitConverter.ToInt32(ReadBuffer, 0);
    8. byte[] ExactText = new byte[size];
    9. int e = ClientS.Receive(ExactText,BitConverter.ToInt32(ReadBuffer, 0),SocketFlags.None);
    10. FileLogger.Log("first receive:" + e);
    11. byte[] t = null;
    12. if (e < size)
    13. {
    14. byte[] buffer2 = new byte[size];
    15. int ee = ClientS.Receive(buffer2);
    16. if (e + ee == size)
    17. {
    18. t = new byte[size];
    19. Buffer.BlockCopy(ExactText, 0, t, 0, e);
    20. Buffer.BlockCopy(buffer2, 0, t, e, ee);
    21. }
    22. FileLogger.Log("second receive:" + ee);
    23. FileLogger.Log("combined amount of Data:" + (e + ee));
    24. }
    25. else
    26. { t = ExactText; }
    27. Message = AESThenHMAC.SimpleDecryptWithPassword(t, AESPASS);
    28. return Message != null ? Message.Length : -1;
    29. }
    30. catch(Exception e)
    31. {
    32. Message = null;
    33. FileLogger.Log(e.Message);
    34. FileLogger.Log(e.StackTrace);
    35. return -1;
    36. }
    37. }


    FileLogger dient lediglich zum schreiben von Debug-Nachrichten in eine Datei.

    Ich kam zu diesem doppelten Empfangen der Bytes, da, wie schon gesagt, eine zufällige Anzahl Bytes einfach fehlte. Selbst wenn ich die Überladung Sockets.Receive(byte[],int,SocketFlags) benutze, werden nicht alle Bytes ausgelesen. Erst nach dem doppelten Empfangen, sind alle Bytes vorhanden.

    Mehr noch ist es seltsam, dass während eines Debugging vorganges mit Breakpoints alles perfekt funktioniert, also wenn ich nach und nach durchschreite.
    Wenn ich Lokal arbeite also nur auf meinem Rechner, dann funktioniert es ebenso tadellos, auch ohne Debugging.

    Zwar habe ich das Problem umgangen, würde jedoch gerne Wissen, was dieses seltsame Verhalten hervorruft, ich hoffe jemand von euch kann mir helfen.

    MfG Earan
    kleines Update, inzwischen habe ich die .Receive() Funktion inne While Schleife gepackackt, die so lange loopt, bis die erwünschte Byte-Größe erreicht wurde. Die Anzahl der Bytes, die bei jedem durchlauf gelesen werden, ist relativ "random" mal gehts in einem Rutsch, mal auf zwei mal, und manchmal auf mehrere Male. Kann mir das mal jemand erklären, wieso das so ist?