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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器