Ich schreibe einen kleinen HttpServer, irgendwann stoße ich auf ein Problem mit fehlenden POST
Daten.C# IInputStream fehlendes segmentiertes TCP-Paket
Durch die Verwendung von Wireshark entdeckte ich, dass die Header
in two segments
aufgeteilt ist.
bekomme ich nur das erste Segment (636 Bytes), die zweite (POST Daten in diesem Fall) wird völlig verloren.
Hier ist eine der entsprechende C# -Code
string requestHeaderString = "";
StreamSocket socketStream = args.Socket;
IInputStream inputStream = socketStream.InputStream;
byte[] data = new byte[BufferSize];
IBuffer buffer = data.AsBuffer();
try
{
await inputStream.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
// This is where things go missing, buffer.ToArray() should be 678 Bytes long,
// so Segment 1 (636 Bytes) and Segment 2 (42 Bytes) combined.
// But is only 636 Bytes long, so just the first Segment?!
requestHeaderString += Encoding.UTF8.GetString(buffer.ToArray());
}
catch (Exception e)
{
Debug.WriteLine("inputStream is not readable" + e.StackTrace);
return;
}
Dieser Code in einem Teil des StreamSocketListener
ConnectionReceived
Event
ist.
Muss ich die TCP-Segmente manuell zusammensetzen, sollte das nicht der System-TCP-Stack tun?
Danke, David
Sie ignorieren den von 'recv()' (oder seinem Wrapper 'Read()') zurückgegebenen Integer-Wert, der das erste Problem ist, dem Menschen beim Schreiben ihres eigenen Codes mit Sockets begegnen. Hast du versucht zu suchen? Nachdem Sie dieses Problem behoben haben, möchten Sie vielleicht http://stackoverflow.com/questions/27228343/what-are-the-consequences-of-not- including-a-content-length-header-in-a-server lesen -r – CodeCaster
_Muss ich die TCP-Segmente manuell neu zusammensetzen, sollte das nicht der System-TCP-Stack tun? _ Ja, Sie müssen die Teile neu zusammensetzen. TCP garantiert einfach, dass die ** Bestellung ** der Teile korrekt ist. Es macht keine Versprechen darüber, wie diese Daten ankommen werden; es könnte in kleinere Stücke zerlegt werden, oder mehrere "Sends" könnten zusammengestückelt ankommen. Es liegt an Ihnen, dem Programmierer zu wissen, wann eine vollständige "Nachricht" angekommen ist, und diese aus Ihrem eigenen Puffer zu extrahieren. Sie ignorieren auch, wie viele Bytes zurückgegeben wurden, was bedeutet, dass der Aufruf von GetString() möglicherweise Müll zurückgibt. –
Eine Reihe von Problemen. Hauptsächlich ignorieren Sie den Rückgabewert, von dem Sie eigentlich Ihre Daten erhalten sollten. Die [Dokumentation] (https://msdn.microsoft.com/library/windows/apps/br241719) könnte nicht klarer darüber sein. * "Lesen Sie immer Daten aus dem Puffer, der in IAsyncOperationWithProgress (IBuffer, UInt32) zurückgegeben wird.Gehen Sie nicht davon aus, dass der Eingabepuffer die Daten enthält. Abhängig von der Implementierung können die gelesenen Daten in den Eingabepuffer gelegt werden, oder sie könnten in einem anderen Puffer zurückgegeben werden. "* Sie sollten versuchen, es zu lesen. – spender