我习惯于使用同步套接字,并且在现在这个节点上,特别是在Socket.Receive(..)
并非总是接收到所有字节的情况下,我遇到了一些头疼的问题。
这里是我曾经使用的代码:
public byte[] Receive(int size)
{
var buffer = new byte[size];
var r = 0;
do
{
// ReSharper disable once InconsistentlySynchronizedField
var c = _clientSocket.Receive(buffer, r, size - r, SocketFlags.None);
if (c == 0)
{
throw new SocketExtendedException();
}
r += c;
} while (r != buffer.Length);
return buffer;
}
我现在开始在Windows Phone中使用sockets,但是.Receive(..)
不可用。我设法让Socket.ReceiveAsync(..)
工作,但我担心(到目前为止没有出现问题)。这是我的新代码,我还没有实现检查是否已经接收到所有字节,也不知道是否需要使用以下代码。
private byte[] ReadBySize(int size = 4)
{
var readEvent = new AutoResetEvent(false);
var buffer = new byte[size];
var recieveArgs = new SocketAsyncEventArgs()
{
UserToken = readEvent
};
recieveArgs.SetBuffer(buffer, 0, size);
recieveArgs.Completed += recieveArgs_Completed;
_connecter.ReceiveAsync(recieveArgs);
readEvent.WaitOne();
if (recieveArgs.BytesTransferred == 0)
{
if (recieveArgs.SocketError != SocketError.Success)
throw new SocketException((int)recieveArgs.SocketError);
throw new CommunicationException();
}
return buffer;
}
void recieveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
var are = (AutoResetEvent)e.UserToken;
are.Set();
}
这是我第一次使用ReceiveAsync
,请问是否有什么我做错或需要更改的地方。
BeginReceive()
。 - BaussTcpClient
/TcpListener
?NetworkStream
更容易操作。 - Luaan