我为这篇冗长的帖子道歉.我仍然尽可能小,同时仍然传达问题.
好的,这让我发疯了.我有一个客户端和一个服务器程序,都在C#中.服务器通过Socket.Send()将数据发送到客户端.客户端通过Socket.BeginReceive和Socket.Receive接收数据.我的伪协议如下:服务器发送一个双向(短)值,表示实际数据的长度,紧接着是实际数据.客户端异步读取前两个字节,将字节转换为short,并立即同步从套接字读取多个字节.
现在每隔几秒左右就可以正常工作一个周期,但是当我提高速度时,事情会变得奇怪.似乎客户端在尝试从两个字节长度读取时会随机读取实际数据.然后它尝试将这些任意两个字节转换为short,这会导致完全不正确的值,从而导致崩溃.以下代码来自我的程序,但修剪为仅显示重要的行.
用于发送数据的服务器端方法:
private static object myLock = new object();
private static bool sendData(Socket sock, String prefix, byte[] data)
{
lock(myLock){
try
{
// prefix is always a 4-bytes string
// encoder is an ASCIIEncoding object
byte[] prefixBytes = encoder.GetBytes(prefix);
short length = (short)(prefixBytes.Length + data.Length);
sock.Send(BitConverter.GetBytes(length));
sock.Send(prefixBytes);
sock.Send(data);
return true;
}
catch(Exception e){/*blah blah blah*/}
}
}
Run Code Online (Sandbox Code Playgroud)
用于接收数据的客户端方法:
private static object myLock = new object();
private void receiveData(IAsyncResult result)
{
lock(myLock){
byte[] buffer = new byte[1024];
Socket sock …Run Code Online (Sandbox Code Playgroud)