首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Socket 非同步操作方法詳解(二):BeginConnect/EndConnect、BeginSend/EndSend、BeginReceive/EndReceive

     編輯:關於C語言

非同步連線:BeginConnect / EndConnect

用於對遠端主機發起非同步 TCP 連線,避免阻塞主執行緒。

BeginConnect 多載

public IAsyncResult BeginConnect(EndPoint remoteEP, AsyncCallback callback, object state);
public IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback callback, object state);
public IAsyncResult BeginConnect(IPAddress[] address, int port, AsyncCallback callback, object state);
public IAsyncResult BeginConnect(string host, int port, AsyncCallback callback, object state);
  • 所有多載皆需 AsyncCallback 委派,連線完成時由執行緒池呼叫。
  • state 可傳遞自訂物件(如 Socket 本身)供回呼使用。

EndConnect

public Socket EndConnect(IAsyncResult asyncResult);
  • 在回呼方法中呼叫,取得已連線的 Socket(若為用戶端即為原 Socket)。
  • 若連線失敗會擲出 SocketException。

非同步發送:BeginSend / EndSend

BeginSend

public IAsyncResult BeginSend(
    byte[] buffer, int offset, int size, SocketFlags socketFlags,
    AsyncCallback callback, object state);

EndSend

public int EndSend(IAsyncResult asyncResult);
  • 回傳實際發送的位元組數。
  • 非同步發送不保證一次送完整個緩衝區,大量資料需迴圈處理。

非同步接收:BeginReceive / EndReceive

BeginReceive

public IAsyncResult BeginReceive(
    byte[] buffer, int offset, int size, SocketFlags socketFlags,
    AsyncCallback callback, object state);

參數與 BeginSend 完全相同。

EndReceive

public int EndReceive(IAsyncResult asyncResult);
  • 回傳實際接收位元組數,0 表示對端關閉連線。
  • 需在回呼中再次呼叫 BeginReceive 形成接收迴圈。

同步 vs 非同步 執行模型比較

參數說明
buffer發送緩衝區
offset緩衝區起始位移
size欲發送位元組數
socketFlagsSocketFlags 列舉組合(如 None, Partial)
模式執行流程適用場景
同步主執行緒呼叫方法 → 等待完成 → 繼續下一行簡單工具、低併發
非同步主執行緒發起請求 → 立即返回 → 完成時由 ThreadPool 呼叫回呼高併發伺服器、UI 應用

非同步模式下,發起與完成是平行執行,大幅提升吞吐量與回應性,但程式碼複雜度較高(回呼地獄),現代開發建議改用 async/await 搭配 SocketAsyncEventArgs 或 NetworkStream。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved