socket-关于SocketAsyncEventArgs异步发送数据后程序自动退出的问题

问题描述

关于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

socket-关于SocketAsyncEventArgs异步发送数据后程序自动退出的问题的相关文章

java使用Socket类接收和发送数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 连接服务器 发送和接收数据 关闭网络连接 一.连接服务器 在

c++-C++矩阵乘法-输入第二个矩阵数据后程序崩溃?

问题描述 C++矩阵乘法-输入第二个矩阵数据后程序崩溃? //初始化第二个矩阵的数据后程序崩溃了?为什么呢? #include using namespace std; int main() { a: int m,n,r,c; cout<<"请输入第一个矩阵的行与列"< cin>>m>>n; cout<<"请输入第二个矩阵的行与列"< cin>>r>>c; if(n!=r) { co

socket-VBS中Socket通过TCP协议发送数据

问题描述 VBS中Socket通过TCP协议发送数据 问题是一个接着一个: 在使用MSWINsock.Winsock通过TCP发送数据到Server的时候,提示如下错误: 代码如下: Dim sock,socket '赋值sock变量为WINSOCK的对象 Set sock = Wscript.createobject("MSWINsock.Winsock") sock.Protocol = 0 sock.RemoteHost = "10.185.59.51" so

wpf程序自动退出请大家分析分析吧

问题描述 wpf程序自动退出请大家分析分析吧 我建了一个UserControl控件,里面有个按钮,这个按钮写了个弹出窗体的代码: MainWindow m = new MainWindow(); //这是一个window窗体不是UserControl m.ShowDialog(); 我运行时,第一次点按钮弹出新窗体,没问题,然后关闭新窗体,再次点击按钮,此时自动退出了,窗体也都关闭了,请问这是咋回事 都是wpf应用程序 解决方案 用f5的方式调试程序,不要用ctrl+f5直接运行,如果报错会有提

c#关于socket使用死循环监听接受数据后程序卡机

问题描述 publicvoidFunctiona(objectsender,EventArgse){//定义发送数据缓存byte[]data=newbyte[1024];//定义字符串,用于控制台输出或输入{IPAddressip=IPAddress.Parse("127.0.0.1");IPEndPointipEnd=newIPEndPoint(ip,5566);//定义套接字类型Socketsocket=newSocket(AddressFamily.InterNetwork,So

MyBatis 中添加数据后怎么 自动在实体类中 获得主键ID

问题描述 比如表item(item_id,item_content) item_id是主键  要求让item_id 自增. 我是在 mysql里面设置item为自增的int型的 在action 里 我创建一个 item表对应的实体 ItemEntity: ItemEntity item=new ItemEntity();item.setItemContent("测试测试");itemService.add(item); 在下面 我要获取这个通过mybatis插入数据的itemID以便

新手提问:Socket Tcp发送数据后如何取得?

问题描述 客户端发送是发送出去了~~可是主机端不知道应该怎么取得... 解决方案 解决方案二:privatevoidbutton1_Click(objectsender,EventArgse){toolStripStatusLabel1.Text="服务器已经启动,开始接收数据";ThreadRun1=newThread(newThreadStart(Run));Run1.Start();}publicvoidRun(){UdpClientRecServ=newUdpClient(10

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.连接服务器 2.发送和接收数据 3.关闭网络连接 一.连

高手进:关于XMLHttpResquest发送数据后返回的问题

问题描述 现在有个问题是这样的:我用下面这个JS文件建立了一个xmlHttp的用户验证,Jscript.js文件functioncheckUserID(){varuid=document.getElementById("tbID").value;varpwd=document.getElementById("tbPwd").value;varnote=document.getElementById("labNote");if(uid=="