最近用SocketAsyncEventArgs来做socket异步通信的服务器,按照官方的例程来写代码,发现异步接收是没有问题的,但是如果用异步发送,发送后程序就自动退出,
调试提示 在 System.InvalidOperationException 中第一次偶然出现的“System.dll”类型的异常
这是发送和接收的代码:
//有连接来到时的回调函数
private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e)
{
//开始同步接受连接
this.ProcessAccept(e);
}
//IO操作完成时的回调函数
private void OnIOCompleted(object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation)
{
//异步接收数据操作完成了,进行同步数据接收
case SocketAsyncOperation.Receive:
this.ProcessReceive(e);
break;
//注意,这里指的是,发送的数据操作完成了,应该开启异步读了
case SocketAsyncOperation.Send:
this.ProcessSend(e);
break;
}
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
//套接字获取的字节数
if (e.BytesTransferred > 0)
{
if (e.SocketError == SocketError.Success)
{
Token token = e.UserToken as Token;
token.SetData(e);
Socket client = token.Connection;
e.SetBuffer(e.Offset, e.BytesTransferred);
if (!client.SendAsync(e))
{
ProcessSend(e);
}
if (client.Available == 0) //获取到有效的数据了,就处理
{
//token.ProcessData(e);
}
//继续为该套接字开启异步读
if (!client.ReceiveAsync(e))
{
this.ProcessReceive(e);
}
}
else
{
this.ProcessError(e);
}
}
else //不是长连接:已经提示可读,但又读不到数据,干脆关闭,等待客户端重连
{
Token token = e.UserToken as Token;
this.CloseClientSocket(token, e);
}
}
//发送的数据操作完成了,应该开启异步读了
private void ProcessSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
Token token = e.UserToken as Token;
if (!token.Connection.ReceiveAsync(e))
{
this.ProcessReceive(e);
}
}
else
{
this.ProcessError(e);
}
}