2012-12-05 44 views
0

我写了一个简单的套接字发送特定的请求到互联网服务器,并收到回应 但我有问题,当请求发送和套接字去接收模式结果的返回值 是不完整的,例如只有1075字节25000字节接收。套接字接收数据没有完成

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()之前数据complitly从服务器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(); 

什么是解决这个问题

回答

3

socket.Receive的最佳解决方案返回读取的数据的数量。请参阅http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

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

TCP是一个面向流的协议。您将按照您发送的订单接收数据,但不保证发送和接收的数据块是平等的。

+0

当i循环中接收之后第一接收抛出异常 – Moharrer

+0

做 { 一个= skt.Receive(数据,ReturnLength,500“的现有连接被强行关闭远程主机” * I - ReturnLength,SocketFlags.None ); skt.Receive(Data); ReturnLength + = a; i ++; } while(a!= 0); – Moharrer

+0

@Moharrer可能发送者在读取器获取所有数据之前关闭连接。你应该设备一些协议来同步它们。例如,发送数据长度,发送数据,等待OK等。 –