所以我建立了一个连接,一切正常,然后我开始设置代码以从服务器读取数据包。我想要构建它的方式是使用一种数据包标识符方法,该方法读取单个字节(数据包 ID)并分支到适当的方法以读取其余部分。问题在于那里的最后一条语句 - 一切正常,直到我分支,当我得到这个异常时:
An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance.
总体思路如下:
private void IdentifyPacket(object sender, SocketAsyncEventArgs e)
{
e.Completed -= new EventHandler<SocketAsyncEventArgs>(IdentifyPacket);
if (e.SocketError != SocketError.Success)
{
ForceDisconnectWithError(new SocketErrorEventArgs(netSocket, e.SocketError));
return;
}
PacketID packet = (PacketID)e.Buffer[0];
switch (packet)
{
case PacketID.KeepAlive:
e.SetBuffer(new byte[4], 0, 4);
e.Completed += new EventHandler<SocketAsyncEventArgs>(HandleKeepAlive);
e.ConnectSocket.ReceiveAsync(e);
break;
default:
RelinkPacketManager();
break;
}
}
private void RelinkPacketManager()
{
socketConfig.SetBuffer(new byte[1], 0, 1);
socketConfig.Completed += new EventHandler<SocketAsyncEventArgs>(IdentifyPacket);
netSocket.ReceiveAsync(socketConfig);
}
想法?
如果你得到一个Packet.KeepAlive
,你会发送另一个请求吗?或者只是等待接收更多数据?如果您需要获取剩余的数据字节,您可能已经在 e.Buffer[0]
之后的字节响应中拥有它。因此,与其事先设置缓冲区大小,不如尝试完全解析您的响应。
希望对您有所帮助。
编辑:试试这个
SocketAsyncEventArgs args;
switch (packet)
{
case PacketID.KeepAlive:
args.SetBuffer(new byte[4], 0, 4);
args.Completed += new EventHandler<SocketAsyncEventArgs>(HandleKeepAlive);
e.ConnectSocket.ReceiveAsync(args);
break;
default:
RelinkPacketManager();
break;
}
我是一名优秀的程序员,十分优秀!