0

特定のリクエストをインターネットサーバーに送信して応答を受信する単純なソケットを作成しましたが、リクエストが送信され、ソケットが受信モードに移行すると、戻り値の結果が完全ではない場合に問題が発生します。

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skt.Connect(hdr.Host, 80);

byte[] req_as_bytes = Encoding.UTF8.GetBytes(RequestParam);
SentLength = skt.Send(req_as_bytes);
skt.Send(Data, SocketFlags.None);

ReturnLength = skt.Receive(Data);

skt.Shutdown(SocketShutdown.Both);
skt.Close();

しかし、skt.recive() の前にスリープ状態にすると、このコードのようにデータがサーバーから完全に受信されます

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream,             ProtocolType.Tcp);
skt.Connect(hdr.Host, 80);
byte[] req_as_bytes = Encoding.UTF8.GetBytes(RequestParam);
SentLength = skt.Send(req_as_bytes);
skt.Send(Data, SocketFlags.None);

System.Threading.Thread.Sleep(4000);

ReturnLength = skt.Receive(Data);

skt.Shutdown(SocketShutdown.Both);
skt.Close();

この問題を解決するための最良の解決策は何ですか

4

1 に答える 1

3

socket.Receive は、読み取ったデータの数を返します。http://msdn.microsoft.com/en-us/library/8s4y8aff.aspxを参照してください

期待されるデータが受信されるまで、チェックReturnLengthしてループする必要があります。

TCP はストリーム指向のプロトコルです。送信した順序でデータを受信しますが、送信されたデータ ブロックと受信されたデータ ブロックが等しいことを保証するものではありません。

于 2012-12-05T19:08:59.593 に答える