我正在使用 C# 套接字(异步模式),需要从流中读取确切的字节数才能正确解析消息。由于我们系统中的消息非常长,因此 socket.EndRead 操作返回的字节数似乎少于 socket.BeginRead 中请求的字节数。只有在读取确切的字节数时才有机会完成 c# 套接字标记操作???正在使用 NetworkStream 吗???\
IAsyncRes ar = socket.BeginRead(1Mb byte message)
ar.Handle.Wait() // --> will signal ONLY when 1Mb us read !!!!
socket.EndRead()
升级版:
我已经用 c# 迭代器解决了它。(此处未显示运行 irator 循环并负责执行 MoveNext 的线程)
protected IEnumerator<IAsyncResult> EnumReceiveExact(byte[] array)
{
int offset = 0;
while (offset < array.Length)
{
SocketError err = SocketError.Success;
IAsyncResult ar = _socket.BeginReceive(array, offset, array.Length - offset, SocketFlags.None, out err, null, null);
Console.WriteLine("{0}:err:{1}", this, err);
if (err != SocketError.Success)
{
_socket.Close();
throw new Exception("Error " + err);
}
yield return ar;
while (!ar.IsCompleted)
{
yield return ar;
}
offset += _socket.EndReceive(ar, out err);
if (err != SocketError.Success)
{
_socket.Close();
throw new Exception("Error " + err);
}
}
}