问题描述
- 关于SocketAsyncEventArgs异步发送数据后程序自动退出的问题
-
最近用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); } }
解决方案
应该是你有线程不同步或者丢出了没有处理的异常造成的,仔细调试下,加上try catch 输出错误。
时间: 2025-01-21 10:20:01