【发布时间】:2015-08-24 07:40:45
【问题描述】:
我习惯于同步套接字,并且为了达到现在的状态有些头疼,尤其是 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 中使用套接字,但 .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() -
在 windows Phone BeginRecieve 和 Recieve 不可用,我也使用 BeginReceive 但它不可用,我只能使用 StreamSocket 或 Socket (with RecieveAsync)
-
是的,对不起,我的错,没有读到它是 windows phone。
-
你在使用 TCP 吗?如果是这种情况,您是否考虑过使用
TcpClient/TcpListener?NetworkStream更容易使用。 -
很遗憾 TcpClient 在 Windows Phone 中也不可用
标签: c# sockets asyncsocket