2 u014556093 u014556093 于 2015.07.13 20:15 提问

关于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);
        }
    }

1个回答

devmiao
devmiao   Ds   Rxr 2015.07.13 22:19

应该是你有线程不同步或者丢出了没有处理的异常造成的,仔细调试下,加上try catch 输出错误。

Csdn user default icon
上传中...
上传图片
插入图片