gpt4 book ai didi

C# TCP Async EndReceive() 仅在 Windows XP 32 位上抛出 InvalidOperationException

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:58 35 4
gpt4 key购买 nike

我有一个简单的 C# 异步客户端,它使用 .NET 套接字等待来自本地 Java 服务器的定时消息,用于自动执行命令。消息异步传入并写入环形缓冲区。此实现似乎在 Windows Vista/7/8 和 OSX 上运行良好,但在从本地 Java 服务器接收消息时会随机抛出此异常:

Unhandled Exception: System.InvalidOperationException: EndReceive can only be called once for each asynchronous operation.
    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult, SocketError& errorCode)
    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
    at SocketTest.Controller.RecvAsyncCallback(IAsyncResult ar)
    at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
    ...

我已在网上查找此错误,但没有找到真正有用的信息。这是它似乎中断的代码:

/// <summary>
/// Callback to receive socket data
/// </summary>
/// <param name="ar">AsyncResult to pass to End</param>
private void RecvAsyncCallback(IAsyncResult ar)
{
// The exception will randomly happen on this call
int bytes = _socket.EndReceive(_recvAsyncResult);

// check for connection closed
if (bytes == 0)
{
return;
}

_ringBuffer.Write(_buffer, 0, bytes);

// Checks buffer
CheckBuffer();

_recvAsyncResult = _sock.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecvAsyncCallback, null);
}

错误不会在任何特定时刻发生,除了在接收消息的过程中。消息本身可以是任意长度的,异常可以立即发生,或者有时甚至长达一分钟的完美沟通。

我对套接字和网络通信很陌生,我觉得我可能在这里遗漏了一些东西。我已经在至少 8 台不同的计算机上进行了测试,与抛出此异常的计算机的唯一相似之处是它们的操作系统是 Windows XP 32 位。

最佳答案

你会想关注 the convention shown here .您正在将 IAsyncResult 传递给 Socket.BeginReceive,它表示上下文中的不同点或完全不同的上下文。

确保在回调中使用调用 EndReceive 时传入的参数。

Windows XP 可能有一个错误修复,这取决于您的服务包和您安装的其他东西,捕捉上下文共享场景或者它可能引入了一个错误,无法正确管理上下文。如果不进行大量测试,很难判断这是否是环境问题。

关于C# TCP Async EndReceive() 仅在 Windows XP 32 位上抛出 InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19847268/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com