C# 套接字接收数据未完成

C# 套接字接收数据未完成,c#,sockets,C#,Sockets,我编写了一个简单的套接字,它向internet服务器发送特定的请求并接收响应 但我有问题时,请求发送和套接字去接收模式返回值的结果 不完整,例如,25000字节接收中只有1075字节 Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); skt.Connect(hdr.Host, 80); byte[] req_as_bytes = Encoding.UTF8.GetB

我编写了一个简单的套接字,它向internet服务器发送特定的请求并接收响应 但我有问题时,请求发送和套接字去接收模式返回值的结果 不完整,例如,25000字节接收中只有1075字节

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()之前加上sleep时,数据完全从服务器接收,就像下面的代码

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();

解决此问题的最佳解决方案是什么?socket.Receive返回读取的数据数。看

您应该检查
ReturnLength
并循环,直到收到预期的数据


TCP是一种面向流的协议。您将按照发送的顺序接收数据,但这并不保证发送和接收的数据块相等。

socket.receive返回读取的数据数。看

您应该检查
ReturnLength
并循环,直到收到预期的数据


TCP是一种面向流的协议。您将按照发送的顺序接收数据,但这并不保证发送和接收的数据块相等。

当我在第一次接收后循环接收时抛出异常“远程主机强制关闭了现有连接”do{a=skt.receive(数据,ReturnLength,500*i-ReturnLength,SocketFlags.None);skt.Receive(Data);ReturnLength+=a;i++;}while(a!=0)@Moharler可能是发送方在读卡器获取所有数据之前关闭了连接。您应该设置一些协议来同步它们。例如,发送数据长度、发送数据、等待确定等。非常感谢,但例如,我收到firefox向www.yahoo.com发送的请求。我无法与雅虎同步:)@moharler如果你真的想使用纯tcp套接字与web服务器通信,那么你应该阅读关于(tcp之上)的内容。如果你想全面实施它,我可以向你保证,这将是一件痛苦的事。我建议为此使用
WebClient
HttpWebRequest
类。当我在第一次接收后循环接收时抛出异常“远程主机强制关闭现有连接”do{a=skt.receive(数据,ReturnLength,500*I-ReturnLength,SocketFlags.None);skt.receive(数据);ReturnLength+=a;i++;}while(a!=0)@Moharler可能是发送方在读卡器获取所有数据之前关闭了连接。您应该设置一些协议来同步它们。例如,发送数据长度、发送数据、等待确定等。非常感谢,但例如,我收到firefox向www.yahoo.com发送的请求。我无法与雅虎同步:)@moharler如果你真的想使用纯tcp套接字与web服务器通信,那么你应该阅读关于(tcp之上)的内容。如果你想全面实施它,我可以向你保证,这将是一件痛苦的事。我建议为此使用
WebClient
HttpWebRequest
类。