Socket类中提供的支持异步操作的方法

在网络编程中运用Socket,常常需要长期监听某个端口,以获得Socket连接,进而执行相关操作。

但此时,主线程就会被阻塞,无法做其他事情。为了解决这类问题,Socket类中提供了一些支持异步操作的方法,如表17-10所示。

表17-10 Socket类中支持异步操作的方法

方法 说明
BeginAccept() 开始一个异步请求,以创建一个新的Socket对象来接受传入的连接请求
EndAccept() 结束一个异步请求,以创建一个新的Socket对象来接受传入的连接请求
BeginConnect() 开始一个对远程主机的异步请求
EndConnect() 结束一个对远程主机的异步请求
BeginDisconnect() 开始异步请求从远程主机断开连接
EndDisconnect() 结束从远程主机断开连接的异步请求
BeginReceive() 开始从连接的Socket中异步接收数据
EndReceive() 结束从连接的Socket中异步接收数据
BeginReceiveFrom() 开始从指定网络设备中异步接收数据
EndReceiveFrom() 结束从指定网络设备中异步接收数据
BeginSend() 开始将数据异步发送到连接的Socket中
EndSend() 结束数据的异步发送
BeginSendFile() 开始将文件异步发送到连接的Socket中
EndSendFile() 结束文件的异步发送
BeginSendTo() 向特定的远程主机异步发送数据
EndSendTo() 结束对远程主机数据的异步发送

从上表中可以看出,这些方法都是成对出现的。这些方法能避免网络通信中的阻塞现象。这些方法的使用机制是在Begin开头的方法中注册一个回调函数,当对应的事件发生时,调用该回调函数,且在回调函数中调用对应的End开头的方法。

下面以BeginAccept()和EndAccept()为例,说明异步方法的用法。BeginAccept()的声明如下所示。

public IAsyncResult BeginAccept(AsynCallback callback,object state);

其中,第一个参数是异步委托AsynCallb了ack,state包含此请求的状态信息的对象。

EndAccept()方法具有三种重载形式,如下所示。

public Socket EndAccept(IAsyncResult asynresult);

public Socket EndAccept(out byte[] buffer,IAsyncResult asynresult);

public Socket EndAccept(out byte[] buffer,out int bytesTransferred, IAsyncResult asynresult,);

asynresult用于存储此异步操作的状态信息及任何用户定义的数据;buffer表示需要传输的字节数据;

bytesTransferred表示已经传输的字节数。这里的out参数与ref的用法类似,均表示传递引用。它们的区别是ref是传递参数的地址,out是返回值。

时间: 2024-10-07 09:41:39

Socket类中提供的支持异步操作的方法的相关文章

C++将CBitmap类中的图像保存到文件的方法_C 语言

本文实例讲述了C++将CBitmap类中的图像保存到文件的方法.分享给大家供大家参考.具体实现方法如下: 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中.支持格式:BMP.JPG.GIF和PNG. void SaveBitmap(CString strFilePath, CBitmap Bitmap) { if ( Bitmap.m_hObject ) { CImage imgTemp; // CImage是MFC中的类. imgTemp.Attach(Bitmap.operat

php遍历类中包含的所有元素的方法

  本文实例讲述了php遍历类中包含的所有元素的方法.分享给大家供大家参考.具体分析如下: 这里可获得php类包含的所有元素以key-value的形式输出 ? 1 2 3 4 5 6 7 8 9 10 11 12 class MyTestClass{ const TESTVAR1 = 1001; const TESTVAR2 = 1002; const TESTSTR1 = 'hello'; } $rc = new ReflectionClass('MyTestClass'); $v = $rc

spring框架,有些类中没有无参构造放方法,但是spring还是可以构造出该实例,它是怎么做到的?

问题描述 spring框架,有些类中没有无参构造放方法,但是spring还是可以构造出该实例,它是怎么做到的? spring的基础是反射,反射是依靠无参构造方法的,但是我的类中没有无参构造放方法,Spring还是给我构造出了实例,Spring是怎么做到的? 解决方案 反射也可以调用有参构造函数甚至私有构造函数的. 没有无参构造函数,你说的是没有写构造函数吧,那么java会产生一个默认的无参数共有构造函数的. 解决方案二: 不写构造器的话,java会默认生成一个无参构造器.写了的话,就不会生成了.

class-fragment类中怎么设置两个spinner方法

问题描述 fragment类中怎么设置两个spinner方法 在fragment类中我想设置三个spinner下拉选择器,但是能设置一个,再弄第二个程序就不能运行了.fragment类中肯定能设置多个spinner,但是我查不到具体方法. 解决方案 C++中两个类交叉定义的处理方法 解决方案二: 在布局文件中直接设置不就得了......

php遍历类中包含的所有元素的方法_php技巧

本文实例讲述了php遍历类中包含的所有元素的方法.分享给大家供大家参考.具体分析如下: 这里可获得php类包含的所有元素以key-value的形式输出 class MyTestClass{ const TESTVAR1 = 1001; const TESTVAR2 = 1002; const TESTSTR1 = 'hello'; } $rc = new ReflectionClass('MyTestClass'); $v = $rc->getConstants(); asort($v);//

js类中获取外部函数名的方法_javascript技巧

比如我们要在一个类中设定一个方法可以根据调入一个方法保存在类变量中,等需要的时候可以通过访问类变量来得到. 通常如果我们生成一个实例 如:var temp=new TopnetTree(); 如果我们通过设定属性的方式来传入一个方法,会发现传入的是一个函数的内容,而非函数名. 如temp.fileAction=fnTest; //fnTest是一个函数 于是偶就写了一个方法来实现此功能. 通过arguments来判断判断传入内容: 实现如下功能: 传入内容为空,不执行任何内容 传入一个参数,则表

js类中获取外部函数名的方法与代码_js面向对象

比如我们要在一个类中设定一个方法可以根据调入一个方法保存在类变量中,等需要的时候可以通过访问类变量来得到. 通常如果我们生成一个实例 如:var temp=new TopnetTree(); 如果我们通过设定属性的方式来传入一个方法,会发现传入的是一个函数的内容,而非函数名. 如temp.fileAction=fnTest; //fnTest是一个函数 于是偶就写了一个方法来实现此功能. 通过arguments来判断判断传入内容: 实现如下功能: 传入内容为空,不执行任何内容 传入一个参数,则表

为DB2 UDB for Linux, UNIX, and Windows提供Unicode支持的实用方法

简介 当今的应用程序常常设计为供国际化使用.这些应用程序可能需要处理不同语言的字符串 .而 Unicode 正是一种与语言无关的字符表示标准. 由于 Java 编程语言已经在内部使用 Unicode 来表示字符,所以国际化应用程序的开发已经容易多了.但是,不能只考虑应用程序端.后端的 数据库也必须能够处理 Unicode 字符.本文将讨论几个主题,帮助开发人员实现供国际化使用的 DB2 UDB 应用程序. DB2 中支持何种 Unicode 标准? 只有一种 Unicode 标准,但是存在不同的

Win7、win2008中让IIS7支持asp的方法_win服务器

 Win2008服务器重装系统后,运行ASP站点(使用Access数据库)报N多错误,经过一小时总算解决,总结如下: 在win2008服务器上 1. 本站点应用程序池改为启用32位. 2. 本站点启用父路径. 3. 全局站点的 错误页 - 编辑功能设置 - 错误响应:选择"详细错误". 4. 给 C:\Window\Temp 目录,设置IUSR读写权限,解决(Microsoft JET Database Engine 错误 '80004005')错误. 1. 让IIS7支持ASP Wi