lk流言 2015-07-13 12:15 采纳率: 0%
浏览 2113

关于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 2015-07-13 14:19
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算