zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    
  • 相关阅读:
    自介
    打招呼
    试验四
    作业:实验二
    个人简介
    实验4
    构建之法—心得体会
    作业:实验二
    个人简介
    软件测试第四次博客作业2
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5593855.html
Copyright © 2011-2022 走看看