Lv.的博客

Socket.EndReceive 方法 (IAsyncResult)

 
 

 

.NET Framework (current version)
 
 

结束挂起的异步读取。

命名空间:   System.Net.Sockets
程序集:  System(System.dll 中)

语法
 

复制
public int EndReceive(
	IAsyncResult asyncResult
)

参数

asyncResult

IAsyncResult,它存储此异步操作的状态信息以及所有用户定义数据。

返回值

Type: System.Int32

接收到的字节数。

异常
 

ExceptionCondition
ArgumentNullException

asyncResultnull

ArgumentException

BeginReceive 方法调用未返回 asyncResult

InvalidOperationException

先前曾为异步读取调用过 EndReceive。

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

备注
 

EndReceive 方法完成在 BeginReceive 方法中启动的异步读取操作。

在调用 BeginReceive 之前,需创建一个实现 AsyncCallback 委托的回调方法。该回调方法在单独的线程中执行并在 BeginReceive 返回后由系统调用。回调方法必须接受 BeginReceive 方法所返回的 IAsyncResult 作为参数。

在回调方法中,调用 IAsyncResultAsyncState 方法以获取传递给 BeginReceive 方法的状态对象。从该状态对象提取接收 Socket在获取 Socket 之后,可以调用 EndReceive 方法以成功完成读取操作,并返回已读取的字节数。

EndReceive 方法将一直阻止到有数据可用为止。如果您使用的是无连接协议,则 EndReceive 将读取传入网络缓冲区中第一个排队的可用数据报。如果您使用的是面向连接的协议,则 EndReceive 方法将读取所有可用的数据,直到达到 BeginReceive 方法的 size 参数所指定的字节数为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 EndReceive 方法将立即完成并返回零字节。

若要获取接收到的数据,请调用 IAsyncResultAsyncState 方法,然后提取所产生的状态对象中包含的缓冲区。

若要取消挂起的 BeginReceive,请调用 Close 方法。

System_CAPS_note注意

如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

System_CAPS_note注意

由给定线程启动的所有 I/O 在该线程退出时均被取消。如果线程在操作完成前退出,挂起的异步操作则会失败。

System_CAPS_note注意

当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。有关详细信息,请参阅 .NET Framework 中的网络跟踪

示例
 

下面的代码示例结束挂起的异步读取。有关演示与套接字异步通信的完整示例,请参见 Socket Code Examples

复制
public static void Read_Callback(IAsyncResult ar){
	StateObject so = (StateObject) ar.AsyncState;
	Socket s = so.workSocket;

	int read = s.EndReceive(ar);

	if (read > 0) {
            so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));
            s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
            	                     new AsyncCallback(Async_Send_Receive.Read_Callback), so);
	}
	else{
	     if (so.sb.Length > 1) {
	          //All of the data has been read, so displays it to the console
	          string strContent;
	          strContent = so.sb.ToString();
	          Console.WriteLine(String.Format("Read {0} byte from socket" + 
	          	               "data = {1} ", strContent.Length, strContent));
	     }
	     s.Close();
	}
}
posted @ 2016-06-17 14:14  Avatarx  阅读(12249)  评论(0编辑  收藏  举报