【发布时间】:2015-09-15 17:03:27
【问题描述】:
当我收到“小”数据时,下面的代码可以正常工作。 但是当我尝试接收大数据时,它总是被切断。 我收到的数据不完整
static ManualResetEvent _clientDone = new ManualResetEvent(false);
const int TIMEOUT_MILLISECONDS = 500000000;
const int MAX_BUFFER_SIZE = 2048;
public string Receive_msg()
{
string response = "Operation Timeout";
if (_socket != null)
{
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');
Debug.WriteLine(response);
}
else
{
response = e.SocketError.ToString();
}
_clientDone.Set();
});
_clientDone.Reset();
_socket.ReceiveAsync(socketEventArg);
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
}
return response;
}
我尝试增加 TIMEOUT_MILLISECONDS 的值和我的 MAX_BUFFER_SIZE 的大小,但没有任何改变。我需要能够获得更大的数据。 而且我必须使用这种方式,我不能使用WebClient或HttpWebRequest...
【问题讨论】:
-
据我所知,您应该将大数据块制作成小字节,然后首先发送一个包含您尝试发送的所有数据长度的数据包。之后,您应该提出 n 请求以获取小尺寸的数据,并在完成后将它们放在一起
-
是什么让您认为您可以一次获得完整、有效的 UTF-8 编码字符串?您调用了一次
Receive,但这并不意味着您一定会在套接字中接收到全部数据。请记住,TCP 套接字实际上是数据流,因此您应该以这种方式对待它们……不要假设您已经阅读完毕,直到您看到流已关闭。如果您尝试在单个连接上交换多条消息,您可能需要为每条消息添加长度前缀。 -
我尝试了几件事情都没有奏效......我仍然无法获得全部数据
-
不幸的是,你把自己画到了一个角落。为此,您需要一个流式 UTF8 解码器。没有其他方法可以判断您是否掌握了全部信息。您正在为糟糕的协议设计付出代价——消息层是在没有计划的情况下实施的。