Socket.EndReceive 方法 (IAsyncResult)


 
 

 

.NET Framework (current version)
 
 

結束掛起的異步讀取。

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

語法
 

復制
public int EndReceive(
	IAsyncResult asyncResult
)

參數

asyncResult

IAsyncResult,它存儲此異步操作的狀態信息以及所有用戶定義數據。

返回值

Type: System.Int32

接收到的字節數。

異常
 

Exception Condition
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();
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM