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