【发布时间】:2017-09-12 00:35:07
【问题描述】:
我正在使用 C# 的异步套接字并使用 BeginReceive 将数据从 Socket 读取到 8192 字节的 byte[]-Buffer 中。但是,在再次调用 BeginReceive 之前有新数据包进来时会发生什么?我当前的设置在停止之前处理大约 3 条传入消息。我假设 Socket 必须先将传入的数据存储在某处,然后才能被 BeginReceive 处理。
我是否可以控制 Socket 在停止之前缓冲多少数据?
我是否必须依靠足够快的速度处理传入的消息才能不“错过”任何消息?
当下面示例中的 ProcessMessageBuffer 方法花费很长时间(由于某种原因)以至于传入的数据开始堆积在 Socket 中时会发生什么?
public void ReadCallback(IAsyncResult ar)
{
// We have a new TCP Packet!
int bytesReceived = 0;
try
{
// The amount of bytes we have just received
bytesReceived = Socket.EndReceive(ar);
}
catch (SocketException ex)
{
// The client closed the connection
OnSocketException(new SocketExceptionEventArgs(ex));
}
if (bytesReceived > 0)
{
// We have received some data. Write it to the MessageBuffer
MessageBuffer.Write(ReceiveBuffer, 0, bytesReceived);
// Process the Messages that may be stored in the MessageBuffer
// What happens, if this takes too long?
ProcessMessageBuffer(MessageBuffer.ToArray());
// Get ready to receive more data
Socket.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), null);
}
}
【问题讨论】:
标签: c# sockets networking tcp