共用方式為


CAsyncSocket 類別

代表 Windows 通訊端 - 網路通訊的端點。

語法

class CAsyncSocket : public CObject

成員

公用建構函式

名稱 描述
CAsyncSocket::CAsyncSocket 建構 CAsyncSocket 物件。

公用方法

名稱 描述
CAsyncSocket::Accept 接受通訊端上的連線。
CAsyncSocket::AsyncSelect 要求通訊端的事件通知。
CAsyncSocket::Attach 將通訊端控制碼附加至 CAsyncSocket 物件。
CAsyncSocket::Bind 將本機位址與通訊端產生關聯。
CAsyncSocket::Close 關閉通訊端。
CAsyncSocket::Connect 建立對等通訊端的連線。
CAsyncSocket::Create 建立通訊端。
CAsyncSocket::CreateEx 建立具有進階選項的通訊端。
CAsyncSocket::Detach 將通訊端控制碼與 CAsyncSocket 物件中斷連結。
CAsyncSocket::FromHandle 指定通訊端控制碼,傳回 物件的指標 CAsyncSocket
CAsyncSocket::GetLastError 取得最後一個失敗作業的錯誤狀態。
CAsyncSocket::GetPeerName 取得通訊端所連接的對等通訊端位址。
CAsyncSocket::GetPeerNameEx 取得通訊端所連接的對等通訊端位址(處理 IPv6 位址)。
CAsyncSocket::GetSockName 取得通訊端的本機名稱。
CAsyncSocket::GetSockNameEx 取得通訊端的本機名稱(處理 IPv6 位址)。
CAsyncSocket::GetSockOpt 擷取通訊端選項。
CAsyncSocket::IOCtl 控制通訊端的模式。
CAsyncSocket::Listen 建立通訊端以接聽連入連線要求。
CAsyncSocket::Receive 從通訊端接收資料。
CAsyncSocket::ReceiveFrom 接收資料包並儲存來源位址。
CAsyncSocket::ReceiveFromEx 接收資料包並儲存來源位址(處理 IPv6 位址)。
CAsyncSocket::Send 將資料傳送到已連線的通訊端。
CAsyncSocket::SendTo 將資料傳送至特定目的地。
CAsyncSocket::SendToEx 將資料傳送至特定目的地(處理 IPv6 位址)。
CAsyncSocket::SetSockOpt 設定通訊端選項。
CAsyncSocket::ShutDown 停用 Send 通訊端上的 和/或 Receive 呼叫。
CASyncSocket::Socket 配置通訊端控制碼。

受保護的方法

名稱 描述
CAsyncSocket::OnAccept 通知接聽通訊端,它可藉由呼叫 Accept 來接受擱置的連線要求。
CAsyncSocket::OnClose 通知通訊端連線到它的通訊端已關閉。
CAsyncSocket::OnConnect 通知連接通訊端連線嘗試是否順利或發生錯誤。
CAsyncSocket::OnOutOfBandData 通知接收通訊端有頻外資料可在通訊端上讀取,通常是緊急訊息。
CAsyncSocket::OnReceive 通知接聽通訊端,呼叫 來擷取 Receive 資料。
CAsyncSocket::OnSend 藉由呼叫 Send ,通知通訊端可以傳送資料。

公用運算子

名稱 描述
CAsyncSocket::operator = 將新的值指派給 CAsyncSocket 物件。
CAsyncSocket::operator SOCKET 使用此運算子來擷 SOCKET 取 物件的控制碼 CAsyncSocket

公用資料成員

名稱 描述
CAsyncSocket::m_hSocket 表示 SOCKET 附加至這個 CAsyncSocket 物件的控制碼。

備註

類別 CAsyncSocket 會封裝 Windows Socket Functions API,為想要搭配 MFC 使用 Windows Socket 的程式設計人員提供物件導向的抽象概念。

此類別是以您瞭解網路通訊的假設為基礎。 您必須負責處理 Unicode 與多位元組字元集 (MBCS) 字串之間的封鎖、位元組順序差異和轉換。 如果您想要更方便的介面來管理這些問題,請參閱 類別 CSocket

若要使用 CAsyncSocket 物件,請呼叫其建構函式,然後呼叫 Create 函式來建立基礎通訊端控制碼 (類型 SOCKET ),但接受的通訊端除外。 針對伺服器通訊端呼叫 Listen 成員函式,以及用戶端通訊端呼叫 Connect 成員函式。 在收到連接要求時,伺服器通訊端應該呼叫 Accept 函式。 使用其餘 CAsyncSocket 函式來執行通訊端之間的通訊。 完成時,如果在堆積上建立物件,則會終結 CAsyncSocket 物件;解構函式會自動呼叫 函 Close 式。 資料類型 SOCKET 會在 Windows Sockets:Background 一文 中說明。

注意

在靜態連結 MFC 應用程式中的次要執行緒中使用 MFC 通訊端時,您必須在每個使用通訊端來初始化通訊端程式庫的執行緒中呼叫 AfxSocketInit 。 根據預設, AfxSocketInit 只會在主要執行緒中呼叫 。

如需詳細資訊,請參閱 Windows 通訊端:使用類別 CAsyncSocket 和相關文章。以及 Windows Sockets 2 API

繼承階層架構

CObject

CAsyncSocket

需求

標頭:afxsock.h

CAsyncSocket::Accept

呼叫此成員函式以接受通訊端上的連線。

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

參數

rConnectedSocket
識別可用於連接之新通訊端的參考。

lpSockAddr
結構的指標 SOCKADDR ,可接收連線通訊端的位址,如網路上所稱。 引數的確切格式是由建立通訊端時所建立的 lpSockAddr 位址系列所決定。 如果 lpSockAddr 和/或 lpSockAddrLen 等於 NULL ,則不會傳回所接受通訊端之遠端位址的相關資訊。

lpSockAddrLen
以位元組為單位 lpSockAddr 之位址長度的指標。 lpSockAddrLen是值結果參數:它一開始應該包含 所 lpSockAddr 指向的空間量;傳回時,它會包含所傳回位址的實際長度(以位元組為單位)。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數太小(小於結構的大小 SOCKADDR )。

  • WSAEINPROGRESS 封鎖的 Windows Sockets 呼叫正在進行中。

  • WSAEINVALListen 在接受之前未叫用 。

  • WSAEMFILE 佇列在要接受的專案時是空的,而且沒有可用的描述元。

  • WSAENOBUFS 沒有可用的緩衝區空間。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPP 參考的通訊端不是支援連線導向服務的型別。

  • WSAEWOULDBLOCK 通訊端標示為非封鎖,且未接受任何連線。

備註

此常式會擷取擱置中連線佇列中的第一個連線、建立與這個通訊端相同的屬性的新通訊端,並將它附加至 rConnectedSocket 。 如果佇列上沒有暫止連線, Accept 則傳回零並 GetLastError 傳回錯誤。 接受的通訊端 ( rConnectedSocket ) 無法用來接受更多連線。 原始通訊端會保持開啟和接聽。

引數 lpSockAddr 是填入連線通訊端位址的結果參數,稱為通訊層。 Accept 與連線型通訊端類型搭配使用,例如 SOCK_STREAM

CAsyncSocket::AsyncSelect

呼叫此成員函式以要求通訊端的事件通知。

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

參數

lEvent
位元遮罩,指定應用程式感興趣的網路事件組合。

  • FD_READ 想要接收閱讀整備的通知。

  • FD_WRITE 想要在資料可供讀取時接收通知。

  • FD_OOB 想要接收頻外資料抵達的通知。

  • FD_ACCEPT 想要接收連入連線的通知。

  • FD_CONNECT 想要接收連線結果的通知。

  • FD_CLOSE 當對等端關閉通訊端時,想要接收通知。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEINVAL 表示其中一個指定的參數無效。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

備註

此函式用來指定將針對通訊端呼叫哪些 MFC 回呼通知函式。 AsyncSelect 會自動將此通訊端設定為非封鎖模式。 如需詳細資訊,請參閱 Windows 通訊端:通訊端通知一

CAsyncSocket::Attach

呼叫這個成員函式,將控制碼附加 hSocketCAsyncSocket 物件。

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

參數

hSocket
包含通訊端的控制碼。

lEvent
位元遮罩,指定應用程式感興趣的網路事件組合。

  • FD_READ 想要接收閱讀整備的通知。

  • FD_WRITE 想要在資料可供讀取時接收通知。

  • FD_OOB 想要接收頻外資料抵達的通知。

  • FD_ACCEPT 想要接收連入連線的通知。

  • FD_CONNECT 想要接收連線結果的通知。

  • FD_CLOSE 當對等端關閉通訊端時,想要接收通知。

傳回值

如果函式成功,則為非零。

備註

SOCKET 柄會儲存在物件 m_hSocket 的資料成員中。

CAsyncSocket::Bind

呼叫此成員函式,以將本機位址與通訊端產生關聯。

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

參數

nSocketPort
識別通訊端應用程式的埠。

lpszSocketAddress
網路位址,點數,例如 「128.56.22.8」。 傳遞此參數的 NULL 字串表示 CAsyncSocket 實例應該接聽所有網路介面上的用戶端活動。

lpSockAddr
結構的指標 SOCKADDR ,其中包含要指派給這個通訊端的位址。

nSockAddrLen
以位元組為單位 lpSockAddr 的位址長度。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列清單涵蓋可能傳回的一些錯誤。 如需完整清單,請參閱 Windows 通訊端錯誤碼

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEADDRINUSE 指定的位址已在使用中。 (請參閱 下方 SetSockOptSO_REUSEADDR 通訊端選項。

  • WSAEFAULTnSockAddrLen 變數太小(小於結構的大小 SOCKADDR )。

  • WSAEINPROGRESS 封鎖的 Windows Sockets 呼叫正在進行中。

  • WSAEAFNOSUPPORT 此埠不支援指定的位址系列。

  • WSAEINVAL 通訊端已系結至位址。

  • WSAENOBUFS 沒有足夠的緩衝區可用,太多連線。

  • WSAENOTSOCK 描述元不是通訊端。

備註

此常式會在後續 ConnectListen 呼叫之前,用於未連接的資料包或資料流程通訊端上。 在接受連線要求之前,接聽伺服器通訊端必須選取埠號碼,並藉由呼叫 Bind 來讓 Windows 通訊端知道。 Bind 將本機名稱指派給未命名的通訊端,以建立通訊端的本機關聯(主機位址/埠號碼)。

CAsyncSocket::CAsyncSocket

建構空白通訊端物件。

CAsyncSocket();

備註

建構 物件之後,您必須呼叫其 Create 成員函式來建立 SOCKET 資料結構並系結其位址。 (在 Windows Sockets 通訊的伺服器端,當接聽通訊端建立要用於呼叫的 Accept 通訊端時,您不會針對該通訊端呼叫 Create

CAsyncSocket::Close

關閉通訊端。

virtual void Close();

備註

此函式會釋放通訊端描述元,讓對它的進一步參考失敗,並出現錯誤 WSAENOTSOCK 。 如果這是基礎通訊端的最後一個參考,則會捨棄相關聯的命名資訊和佇列資料。 通訊端物件的解構函式會為您呼叫 Close

針對 CAsyncSocket ,但不適用於 CSocket ,的語 Close 意會受到通訊端選項 SO_LINGERSO_DONTLINGER 的影響。 如需詳細資訊,請參閱成員函式 GetSockOpt

CAsyncSocket::Connect

呼叫這個成員函式,以建立與未連接資料流程或資料包通訊端的連接。

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

參數

lpszHostAddress
此物件所連接的通訊端網路位址:電腦名稱稱,例如 「ftp.microsoft.com」,或虛線數位,例如 「128.56.22.8」。

nHostPort
識別通訊端應用程式的埠。

lpSockAddr
結構的指標 SOCKADDR ,其中包含連接的通訊端位址。

nSockAddrLen
以位元組為單位 lpSockAddr 的位址長度。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 如果這表示 的錯誤碼 WSAEWOULDBLOCK ,而且您的應用程式正在使用可覆寫的回呼,則應用程式會在連線作業完成時收到 OnConnect 訊息。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEADDRINUSE 指定的位址已在使用中。

  • WSAEINPROGRESS 封鎖的 Windows Sockets 呼叫正在進行中。

  • WSAEADDRNOTAVAIL 指定的位址無法從本機電腦取得。

  • WSAEAFNOSUPPORT 指定系列中的位址無法與這個通訊端搭配使用。

  • WSAECONNREFUSED 嘗試連線遭到拒絕。

  • WSAEDESTADDRREQ 需要目的地位址。

  • WSAEFAULTnSockAddrLen 變數不正確。

  • WSAEINVAL 不正確主機位址。

  • WSAEISCONN 通訊端已連線。

  • WSAEMFILE 沒有其他檔案描述項可供使用。

  • WSAENETUNREACH 目前無法從此主機連線到網路。

  • WSAENOBUFS 沒有可用的緩衝區空間。 通訊端無法連接。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAETIMEDOUT 嘗試連線逾時,而不建立連線。

  • WSAEWOULDBLOCK 通訊端標示為非封鎖,且無法立即完成連線。

備註

如果通訊端未系結,系統會將唯一值指派給本機關聯,而且通訊端會標示為系結。 請注意,如果名稱結構的位址欄位全部為零, Connect 則會傳回零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError 成員函式。

針對資料流程通訊端(類型 SOCK_STREAM ),會起始對外部主機的作用中連線。 通訊端呼叫順利完成時,通訊端已準備好傳送/接收資料。

若為資料包通訊端(類型 SOCK_DGRAM ),則會設定預設目的地,以供後續 SendReceive 呼叫使用。

CAsyncSocket::Create

Create在建構通訊端物件之後呼叫成員函式,以建立 Windows 通訊端並附加它。

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

參數

nSocketPort
要與通訊端搭配使用的已知埠,如果您想要 Windows 通訊端選取埠,則為 0。

nSocketType
SOCK_STREAMSOCK_DGRAM

lEvent
位元遮罩,指定應用程式感興趣的網路事件組合。

  • FD_READ 想要接收閱讀整備的通知。

  • FD_WRITE 想要接收準備寫入的通知。

  • FD_OOB 想要接收頻外資料抵達的通知。

  • FD_ACCEPT 想要接收連入連線的通知。

  • FD_CONNECT 想要接收已完成連線的通知。

  • FD_CLOSE 想要接收通訊端關閉的通知。

lpszSockAddress
字串的指標,包含已連線通訊端的網路位址,即點數,例如 「128.56.22.8」。 傳遞此參數的 NULL 字串表示 CAsyncSocket 實例應該接聽所有網路介面上的用戶端活動。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEAFNOSUPPORT 不支援指定的位址系列。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEMFILE 沒有其他檔案描述項可供使用。

  • WSAENOBUFS 沒有可用的緩衝區空間。 無法建立通訊端。

  • WSAEPROTONOSUPPORT 不支援指定的埠。

  • WSAEPROTOTYPE 指定的埠是這個通訊端的錯誤類型。

  • WSAESOCKTNOSUPPORT 此位址系列不支援指定的通訊端類型。

備註

Create 會呼叫 Socket ,如果成功,它會呼叫 Bind 將通訊端系結至指定的位址。 支援下列通訊端類型:

  • SOCK_STREAM 提供循序、可靠、全雙工、連線型位元組資料流程。 針對網際網路位址系列使用傳輸控制通訊協定 (TCP)。

  • SOCK_DGRAM 支援資料包,這些資料包是無連線、不可靠的固定封包(通常很小)最大長度。 使用網際網路位址系列的使用者資料包通訊協定 (UDP)。

    注意

    成員 Accept 函式會採用對新的空白 CSocket 物件做為其參數的參考。 您必須先建構這個物件,才能呼叫 Accept 。 請記住,如果這個通訊端物件超出範圍,連線就會關閉。 請勿呼叫 Create 這個新的通訊端物件。

重要

Create 不是 安全線程。 如果您要在不同的執行緒同時叫用多執行緒環境中呼叫它,請務必使用 Mutex 或其他同步鎖定來保護每個呼叫。

如需資料流程和資料包通訊端的詳細資訊,請參閱 Windows 通訊端:背景 和 Windows 通訊端:埠和通訊端位址 Windows 通訊端 2 API 一文 。

CAsyncSocket::CreateEx

CreateEx在建構通訊端物件之後呼叫成員函式,以建立 Windows 通訊端並附加它。

當您需要提供進階選項,例如通訊端類型時,請使用此函式。

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

參數

pAI
用來保存通訊端資訊的指標 ADDRINFOT ,例如系列和通訊端類型。

lEvent
位元遮罩,指定應用程式感興趣的網路事件組合。

  • FD_READ 想要接收閱讀整備的通知。

  • FD_WRITE 想要接收準備寫入的通知。

  • FD_OOB 想要接收頻外資料抵達的通知。

  • FD_ACCEPT 想要接收連入連線的通知。

  • FD_CONNECT 想要接收已完成連線的通知。

  • FD_CLOSE 想要接收通訊端關閉的通知。

傳回值

請參閱 的 Create() 傳回值。

備註

請參閱 的 Create() 備註。

CAsyncSocket::Detach

呼叫這個成員函式,從 物件卸離 SOCKET 資料成員 CAsyncSocket 中的 m_hSocket 控制碼,並將 設定 m_hSocketNULL

SOCKET Detach();

CAsyncSocket::FromHandle

傳回 物件的指標 CAsyncSocket

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

參數

hSocket
包含通訊端的控制碼。

傳回值

物件的指標 CAsyncSocket ,如果沒有附加至 hSocket 的物件, NULLCAsyncSocket 為 。

備註

指定 SOCKET 控制碼時,如果 CAsyncSocket 物件未附加至控制碼,則成員函式會傳 NULL 回 。

CAsyncSocket::GetLastError

呼叫這個成員函式,以取得最後一個失敗作業的錯誤狀態。

static int PASCAL GetLastError();

傳回值

傳回值表示這個執行緒所執行之最後一個 Windows Sockets API 常式的錯誤碼。

備註

當特定成員函式指出發生錯誤時, GetLastError 應該呼叫 以擷取適當的錯誤碼。 如需適用的錯誤碼清單,請參閱個別成員函式描述。

如需錯誤碼的詳細資訊,請參閱 Windows Sockets 2 API

CAsyncSocket::GetPeerName

呼叫這個成員函式,以取得此通訊端所連接的對等通訊端位址。

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

參數

rPeerAddress
CString接收點數 IP 位址的物件參考。

rPeerPort
UINT儲存埠的 參考。

lpSockAddr
接收對等通訊端名稱之 結構的指標 SOCKADDR

lpSockAddrLen
以位元組為單位 lpSockAddr 之位址長度的指標。 傳回時,自 lpSockAddrLen 變數會包含以位元組為單位傳回的實際大小 lpSockAddr

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數不夠大。

  • WSAEINPROGRESS 封鎖的 Windows Sockets 呼叫正在進行中。

  • WSAENOTCONN 通訊端未連線。

  • WSAENOTSOCK 描述元不是通訊端。

備註

若要處理 IPv6 位址,請使用 CAsyncSocket::GetPeerNameEx

CAsyncSocket::GetPeerNameEx

呼叫此成員函式,以取得此通訊端所連接的對等通訊端位址(處理 IPv6 位址)。

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

參數

rPeerAddress
CString接收點數 IP 位址的物件參考。

rPeerPort
UINT儲存埠的 參考。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數不夠大。

  • WSAEINPROGRESS 封鎖的 Windows Sockets 呼叫正在進行中。

  • WSAENOTCONN 通訊端未連線。

  • WSAENOTSOCK 描述元不是通訊端。

備註

此函式與 CAsyncSocket::GetPeerName 處理 IPv6 位址和較舊的通訊協定相同。

CAsyncSocket::GetSockName

呼叫這個成員函式以取得通訊端的本機名稱。

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

參數

rSocketAddress
CString接收點數 IP 位址的物件參考。

rSocketPort
UINT儲存埠的 參考。

lpSockAddr
接收通訊端位址之 結構的指標 SOCKADDR

lpSockAddrLen
以位元組為單位 lpSockAddr 之位址長度的指標。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數不夠大。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEINVAL 通訊端尚未系結至具有 Bind 的位址。

備註

此呼叫在呼叫未先執行時特別有用 Connect ;此呼叫會提供唯一 Bind 的方法,讓您判斷系統已設定的本機關聯。

若要處理 IPv6 位址,請使用 CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

呼叫此成員函式以取得通訊端的本機名稱(處理 IPv6 位址)。

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

參數

rSocketAddress
CString接收點數 IP 位址的物件參考。

rSocketPort
UINT儲存埠的 參考。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數不夠大。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEINVAL 通訊端尚未系結至具有 Bind 的位址。

備註

此呼叫與 CAsyncSocket::GetSockName 處理 IPv6 位址和較舊的通訊協定相同。

此呼叫在呼叫未先執行時特別有用 Connect ;此呼叫會提供唯一 Bind 的方法,讓您判斷系統已設定的本機關聯。

CAsyncSocket::GetSockOpt

呼叫這個成員函式以擷取通訊端選項。

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

參數

nOptionName
要擷取值的通訊端選項。

lpOptionValue
要傳回所要求選項值的緩衝區指標。 與選取之選項相關聯的值會在緩衝區 lpOptionValue 中傳回。 所 lpOptionLen 指向的整數原本應該包含這個緩衝區的大小,以位元組為單位;而且在傳回時,它會設定為傳回的值大小。 針對 SO_LINGER ,這會是 結構的大小 LINGER ;針對所有其他選項,它會是 BOOL 或 int 的大小,視選項而定。 請參閱一節中的選項及其大小清單。

lpOptionLen
以位元組為單位之緩衝區大小的 lpOptionValue 指標。

nLevel
定義選項的層級;唯一支援的層級是 SOL_SOCKETIPPROTO_TCP

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 如果從未使用 SetSockOpt 設定選項,則會 GetSockOpt 傳回選項的預設值。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpOptionLen 變數無效。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOPROTOOPT 選項未知或不受支援。 特別是 , SO_BROADCAST 在 類型的通訊端上不支援 ,而 SO_ACCEPTCONN 類型 SOCK_STREAMSOCK_DGRAM 為 的通訊端不支援 、 SO_DONTLINGERSO_KEEPALIVESO_LINGER 、 和 。 SO_OOBINLINE

  • WSAENOTSOCK 描述元不是通訊端。

備註

GetSockOpt 擷取與任何類型通訊端、處於任何狀態之通訊端相關聯的通訊端選項目前值,並將結果儲存在 lpOptionValue 中。 選項會影響通訊端作業,例如封包路由、頻外資料傳輸等等。

支援 GetSockOpt 下列選項。 Type 會識別 所 lpOptionValue 定址的資料類型。 選項 TCP_NODELAY 會使用層級 IPPROTO_TCP ;所有其他選項都會使用層級 SOL_SOCKET

類型 意義
SO_ACCEPTCONN BOOL 通訊端正在接聽。
SO_BROADCAST BOOL 通訊端已設定為廣播訊息的傳輸。
SO_DEBUG BOOL 已啟用偵錯。
SO_DONTLINGER BOOL 如果為 true,則會 SO_LINGER 停用選項。
SO_DONTROUTE BOOL 路由已停用。
SO_ERROR int 擷取錯誤狀態並清除。
SO_KEEPALIVE BOOL 正在傳送 Keep-alives。
SO_LINGER struct LINGER 傳回目前的揮之不去選項。
SO_OOBINLINE BOOL 頻外資料正在一般資料流程中接收。
SO_RCVBUF int 接收的緩衝區大小。
SO_REUSEADDR BOOL 通訊端可以系結至已在使用的位址。
SO_SNDBUF int 傳送的緩衝區大小。
SO_TYPE int 通訊端的類型 (例如 , SOCK_STREAM )。
TCP_NODELAY BOOL 停用用於傳送聯合的 Nagle 演算法。

Berkeley Software Distribution (BSD) 不支援 GetSockOpt 的選項如下:

類型 意義
SO_RCVLOWAT int 接收低水位標記。
SO_RCVTIMEO int 接收逾時。
SO_SNDLOWAT int 傳送低浮水印。
SO_SNDTIMEO int 傳送逾時。
IP_OPTIONS 取得 IP 標頭中的選項。
TCP_MAXSEG int 取得 TCP 區段大小上限。

使用不支援的選項呼叫 GetSockOpt 會導致從 GetLastError 傳回錯誤碼 WSAENOPROTOOPT

CAsyncSocket::IOCtl

呼叫這個成員函式來控制通訊端的模式。

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

參數

lCommand
在通訊端上執行的命令。

lpArgument
lCommand 參數指標。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEINVALlCommand 不是有效的命令,或 lpArgument 不是 可接受的 lCommand 參數,或命令不適用於提供的通訊端類型。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOTSOCK 描述元不是通訊端。

備註

此常式可在任何狀態的任何通訊端上使用。 它用來取得或擷取與通訊端相關聯的作業參數,與通訊協定和通訊子系統無關。 支援下列命令:

  • FIONBIO 在通訊端上啟用或停用非封鎖模式。 參數 lpArgument 指向 DWORD ,如果啟用非封鎖模式,則為非零,如果停用則為零。 如果 AsyncSelect 已在通訊端上發出,則任何將 IOCtl 通訊端設定回封鎖模式的嘗試都會失敗。 WSAEINVAL 若要將通訊端設定回封鎖模式並防止 WSAEINVAL 錯誤,應用程式必須先呼叫 AsyncSelectlEvent 等於 0 的參數來停用 AsyncSelect ,然後呼叫 IOCtl

  • FIONREAD 決定可從這個通訊端使用一個 Receive 呼叫讀取的最大位元組數目。 參數 lpArgument 會指向 DWORD 儲存 IOCtl 結果的 。 如果此通訊端的類型 SOCK_STREAM 為 , FIONREAD 會傳回可在單 Receive 一讀取的資料總量;這通常與通訊端上排入佇列的資料總量相同。 如果此通訊端的類型 SOCK_DGRAM 為 , FIONREAD 則傳回通訊端上排入佇列的第一個資料包大小。

  • SIOCATMARK 判斷是否已讀取所有頻外資料。 這只適用于已針對任何頻外資料進行內嵌接收的型 SOCK_STREAM 別通訊端 ( SO_OOBINLINE 。 如果沒有頻外資料正在等候讀取,作業會傳回非零。 否則會傳回 0,而通訊端上執行的下一個 ReceiveReceiveFrom 執行將會擷取部分或所有資料之前「標記」;應用程式應該使用 SIOCATMARK 作業來判斷是否有任何資料保留。 如果「緊急」(頻外)資料之前有任何一般資料,則會依序接收。 (請注意, ReceiveReceiveFrom 永遠不會在相同呼叫中混用頻外和一般資料。參數 lpArgument 會指向 DWORD 儲存 IOCtl 結果的 。

此函式是 伯克利通訊端中使用的 子集 ioctl() 。 特別是沒有相當於 FIOASYNC 的命令,而 SIOCATMARK 是唯一支援的通訊端層級命令。

CAsyncSocket::Listen

呼叫此成員函式以接聽連入連線要求。

BOOL Listen(int nConnectionBacklog = 5);

參數

nConnectionBacklog
暫止連線佇列可以成長的最大長度。 有效範圍從 1 到 5。

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEADDRINUSE 已嘗試接聽使用中的位址。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEINVAL 通訊端尚未系結或 Bind 已連線。

  • WSAEISCONN 通訊端已連線。

  • WSAEMFILE 沒有其他檔案描述項可供使用。

  • WSAENOBUFS 沒有可用的緩衝區空間。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPP 參考的通訊端不是支援作業的類型 Listen

備註

若要接受連線,會先使用 Create 建立通訊端,使用 指定 Listen 內送連線的待處理專案,然後使用 接受 Accept 連接。 Listen 僅適用于支援連線的通訊端,也就是 類型 SOCK_STREAM 為 的通訊端。 此通訊端會進入「被動」模式,其中傳入連線會得到認可,並排入進程等待接受的佇列。

伺服器(或任何想要接受連線的應用程式)通常會使用此函式,一次可以有多個連線要求:如果連線要求到達佇列已滿,用戶端會收到錯誤,並指出 WSAECONNREFUSED

Listen 當沒有可用的埠(描述項)時,嘗試繼續理性地運作。 它會接受連線,直到佇列清空為止。 如果埠可供使用,稍後呼叫 ListenAccept 會盡可能將佇列重新填入至目前或最新的「待辦專案」,並繼續接聽連入連線。

CAsyncSocket::m_hSocket

包含 SOCKET 這個 CAsyncSocket 物件所封裝之通訊端的控制碼。

SOCKET m_hSocket;

CAsyncSocket::OnAccept

由架構呼叫,以通知接聽通訊端,它可藉由呼叫成員函式來接受擱置的 Accept 連線要求。

virtual void OnAccept(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnAccept 成員函式:

  • 0 函式已成功執行。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

備註

如需詳細資訊,請參閱 Windows 通訊端:通訊端通知

CAsyncSocket::OnClose

由架構呼叫,以通知此通訊端連線的通訊端已由其進程關閉。

virtual void OnClose(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnClose 成員函式:

  • 0 函式已成功執行。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAECONNRESET 連線已由遠端端重設。

  • WSAECONNABORTED 連線因為逾時或其他失敗而中止。

備註

如需詳細資訊,請參閱 Windows 通訊端:通訊端通知

CAsyncSocket::OnConnect

由架構呼叫,通知此連接通訊端其連線嘗試已完成,無論是成功還是發生錯誤。

virtual void OnConnect(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnConnect 成員函式:

  • 0 函式已成功執行。

  • WSAEADDRINUSE 指定的位址已在使用中。

  • WSAEADDRNOTAVAIL 指定的位址無法從本機電腦取得。

  • WSAEAFNOSUPPORT 指定系列中的位址無法與這個通訊端搭配使用。

  • WSAECONNREFUSED 嘗試連線時遭到強制拒絕。

  • WSAEDESTADDRREQ 需要目的地位址。

  • WSAEFAULTlpSockAddrLen 變數不正確。

  • WSAEINVAL 通訊端已系結至位址。

  • WSAEISCONN 通訊端已連線。

  • WSAEMFILE 沒有其他檔案描述項可供使用。

  • WSAENETUNREACH 目前無法從此主機連線到網路。

  • WSAENOBUFS 沒有可用的緩衝區空間。 通訊端無法連接。

  • WSAENOTCONN 通訊端未連線。

  • WSAENOTSOCK 描述項是檔案,而不是通訊端。

  • WSAETIMEDOUT 嘗試連線逾時,而不需建立連線。

備註

注意

在 中 CSocketOnConnect 永遠不會呼叫通知函式。 針對連線,您只需呼叫 Connect ,這會在連線完成時傳回 (成功或發生錯誤)。 如何處理連線通知是 MFC 實作詳細資料。

如需詳細資訊,請參閱 Windows 通訊端:通訊端通知

範例

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

由架構呼叫,以通知接收通訊端傳送通訊端具有要傳送的頻外資料。

virtual void OnOutOfBandData(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnOutOfBandData 成員函式:

  • 0 函式已成功執行。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

備註

頻外資料是邏輯上獨立的通道,與 類型的 SOCK_STREAM 每個連線通訊端組相關聯。 通道通常用來傳送緊急資料。

MFC 支援頻外資料,但不建議使用類別 CAsyncSocket 的使用者。 最簡單的方式是建立第二個通訊端來傳遞這類資料。 如需頻外資料的詳細資訊,請參閱 Windows 通訊端:通訊端通知

CAsyncSocket::OnReceive

由架構呼叫,以通知這個通訊端,緩衝區中有資料可藉由呼叫 Receive 成員函式來擷取。

virtual void OnReceive(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnReceive 成員函式:

  • 0 函式已成功執行。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

備註

如需詳細資訊,請參閱 Windows 通訊端:通訊端通知

範例

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

由架構呼叫,以通知通訊端,它現在可以藉由呼叫 Send 成員函式來傳送資料。

virtual void OnSend(int nErrorCode);

參數

nErrorCode
通訊端上最近的錯誤。 下列錯誤碼適用于 OnSend 成員函式:

  • 0 函式已成功執行。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

備註

如需詳細資訊,請參閱 Windows 通訊端:通訊端通知

範例

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

將新的值指派給 CAsyncSocket 物件。

void operator=(const CAsyncSocket& rSrc);

參數

rSrc
現有 CAsyncSocket 物件的參考。

備註

呼叫此函式,將現有的 CAsyncSocket 物件複製到另一個 CAsyncSocket 物件。

CAsyncSocket::operator SOCKET

使用此運算子來擷 SOCKET 取 物件的控制碼 CAsyncSocket

operator SOCKET() const;

傳回值

如果成功,則為 物件的控制碼 SOCKETNULL 否則為 。

備註

您可以使用 控制碼直接呼叫 Windows API。

CAsyncSocket::Receive

呼叫這個成員函式以接收通訊端的資料。

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

參數

lpBuf
傳入資料的緩衝區。

nBufLen
位元組的 lpBuf 長度。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_PEEK 查看傳入的資料。 資料會複製到緩衝區,但不會從輸入佇列中移除。

  • MSG_OOB 處理頻外資料。

傳回值

如果沒有發生錯誤, Receive 則傳回收到的位元組數目。 如果連接已關閉,則會傳回 0。 否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAENOTCONN 通訊端未連線。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 0 或 2 之後 ShutDown ,就無法在通訊端上呼叫 Receive

  • WSAEWOULDBLOCK 通訊端標示為非封鎖,且 Receive 作業會封鎖。

  • WSAEMSGSIZE 資料包太大而無法放入指定的緩衝區,而且已截斷。

  • WSAEINVAL 通訊端尚未與 Bind 系結。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

備註

此函式用於連接的資料流程或資料包通訊端,並用來讀取傳入資料。

針對 類型的 SOCK_STREAM 通訊端,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外資料(通訊端選項 SO_OOBINLINE )和頻外資料的內嵌接收設定通訊端未讀取,則只會傳回頻外資料。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外資料。

針對資料包通訊端,資料會從第一個排入佇列的資料包擷取,最多可擷取到提供的緩衝區大小。 如果資料包大於提供的緩衝區,則緩衝區會填入資料包的第一個部分、遺失多餘的資料,並傳回 的值,並將 Receive 錯誤碼設定為 WSAEMSGSIZESOCKET_ERROR 如果通訊端上沒有可用的傳入資料,則會傳回 值 SOCKET_ERROR ,並將錯誤碼設定為 WSAEWOULDBLOCK 。 回 OnReceive 呼函式可用來判斷何時有更多資料到達。

如果通訊端的類型為 , SOCK_STREAM 且遠端端已正常關閉連線, Receive 則會立即完成 0 個位元組的接收。 如果已重設連線, Receive 將會失敗並出現錯誤 WSAECONNRESET

Receive 每次呼叫時 CAsyncSocket::OnReceive ,應該只呼叫一次。

範例

請參閱 的 CAsyncSocket::OnReceive 範例。

CAsyncSocket::ReceiveFrom

呼叫這個成員函式以接收資料包,並將來源位址儲存在 SOCKADDR 結構或 中 rSocketAddress

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

參數

lpBuf
傳入資料的緩衝區。

nBufLen
位元組的 lpBuf 長度。

rSocketAddress
CString接收點數 IP 位址的物件參考。

rSocketPort
UINT儲存埠的 參考。

lpSockAddr
在傳回時保存來源位址之結構的指標 SOCKADDR

lpSockAddrLen
以位元組為單位 lpSockAddr 之來源位址長度的指標。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_PEEK 查看傳入的資料。 資料會複製到緩衝區,但不會從輸入佇列中移除。

  • MSG_OOB 處理頻外資料。

傳回值

如果沒有發生錯誤, ReceiveFrom 則傳回收到的位元組數目。 如果連接已關閉,則會傳回 0。 否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數無效: lpSockAddr 緩衝區太小,無法容納對等位址。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEINVAL 通訊端尚未與 Bind 系結。

  • WSAENOTCONN 通訊端未連接( SOCK_STREAM 僅限)。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 0 或 2 之後 ShutDown ,就無法在通訊端上呼叫 ReceiveFrom

  • WSAEWOULDBLOCK 通訊端標示為非封鎖,且 ReceiveFrom 作業會封鎖。

  • WSAEMSGSIZE 資料包太大而無法放入指定的緩衝區,而且已截斷。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

備註

此函式用來讀取 (可能連線) 通訊端上的傳入資料,並擷取資料從中傳送的位址。

若要處理 IPv6 位址,請使用 CAsyncSocket::ReceiveFromEx

針對 類型的 SOCK_STREAM 通訊端,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外資料(通訊端選項 SO_OOBINLINE )和頻外資料的內嵌接收設定通訊端未讀取,則只會傳回頻外資料。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外資料。 通訊端 lpSockAddrSOCK_STREAM 忽略 和 lpSockAddrLen 參數。

針對資料包通訊端,資料會從第一個排入佇列的資料包擷取,最多可擷取到提供的緩衝區大小。 如果資料包大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的資料,並傳回 值,並將 ReceiveFrom 錯誤碼設定為 WSAEMSGSIZESOCKET_ERROR

如果 lpSockAddr 為非零,且通訊端的類型 SOCK_DGRAM 為 ,則傳送資料之通訊端的網路位址會複製到對應的 SOCKADDR 結構。 所 lpSockAddrLen 指向的值會初始化為此結構的大小,並在傳回時修改,以指出儲存在那裡之位址的實際大小。 如果通訊端沒有可用的傳入資料,除非通訊端未封鎖,否則 ReceiveFrom 呼叫會等候資料到達。 在此情況下,會傳回 值 SOCKET_ERROR ,並將錯誤碼設定為 WSAEWOULDBLOCK 。 回 OnReceive 呼可用來判斷何時有更多資料到達。

如果通訊端的類型為 , SOCK_STREAM 且遠端端已正常關閉連線, ReceiveFrom 則會立即完成 0 個位元組的接收。

CAsyncSocket::ReceiveFromEx

呼叫此成員函式以接收資料包,並將來源位址儲存在 結構或 中 SOCKADDRrSocketAddress (處理 IPv6 位址)。

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

參數

lpBuf
傳入資料的緩衝區。

nBufLen
位元組的 lpBuf 長度。

rSocketAddress
CString接收點數 IP 位址的物件參考。

rSocketPort
UINT儲存埠的 參考。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_PEEK 查看傳入的資料。 資料會複製到緩衝區,但不會從輸入佇列中移除。

  • MSG_OOB 處理頻外資料。

傳回值

如果沒有發生錯誤, ReceiveFromEx 則傳回收到的位元組數目。 如果連接已關閉,則會傳回 0。 否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpSockAddrLen 變數無效: lpSockAddr 緩衝區太小,無法容納對等位址。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEINVAL 通訊端尚未與 Bind 系結。

  • WSAENOTCONN 通訊端未連接( SOCK_STREAM 僅限)。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 0 或 2 之後 ShutDown ,就無法在通訊端上呼叫 ReceiveFromEx

  • WSAEWOULDBLOCK 通訊端標示為非封鎖,且 ReceiveFromEx 作業會封鎖。

  • WSAEMSGSIZE 資料包太大而無法放入指定的緩衝區,而且已截斷。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

備註

此函式用來讀取 (可能連線) 通訊端上的傳入資料,並擷取資料從中傳送的位址。

此函式與 CAsyncSocket::ReceiveFrom 處理 IPv6 位址和較舊的通訊協定相同。

針對 類型的 SOCK_STREAM 通訊端,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外資料(通訊端選項 SO_OOBINLINE )和頻外資料的內嵌接收設定通訊端未讀取,則只會傳回頻外資料。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外資料。 通訊端 lpSockAddrSOCK_STREAM 忽略 和 lpSockAddrLen 參數。

針對資料包通訊端,資料會從第一個排入佇列的資料包擷取,最多可擷取到提供的緩衝區大小。 如果資料包大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的資料,並傳回 值,並將 ReceiveFromEx 錯誤碼設定為 WSAEMSGSIZESOCKET_ERROR

如果 lpSockAddr 為非零,且通訊端的類型 SOCK_DGRAM 為 ,則傳送資料之通訊端的網路位址會複製到對應的 SOCKADDR 結構。 所 lpSockAddrLen 指向的值會初始化為此結構的大小,並在傳回時修改,以指出儲存在那裡之位址的實際大小。 如果通訊端沒有可用的傳入資料,除非通訊端未封鎖,否則 ReceiveFromEx 呼叫會等候資料到達。 在此情況下,會傳回 值 SOCKET_ERROR ,並將錯誤碼設定為 WSAEWOULDBLOCK 。 回 OnReceive 呼可用來判斷何時有更多資料到達。

如果通訊端的類型為 , SOCK_STREAM 且遠端端已正常關閉連線, ReceiveFromEx 則會立即完成 0 個位元組的接收。

CAsyncSocket::Send

呼叫此成員函式以在連接的通訊端上傳送資料。

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

參數

lpBuf
緩衝區,包含要傳輸的資料。

nBufLen
以位元組為單位 lpBuf 的資料長度。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_DONTROUTE 指定資料不應受限於路由。 Windows Sockets 供應商可以選擇忽略此旗標。

  • MSG_OOB 傳送頻外資料( SOCK_STREAM 僅限)。

傳回值

如果沒有發生錯誤, Send 則傳回傳送的字元總數。 (請注意,這可以小於 所 nBufLen 指出的數位。否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEACCES 要求的位址是廣播位址,但未設定適當的旗標。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEFAULTlpBuf 變數不在使用者位址空間的有效部分中。

  • WSAENETRESET 連線必須重設,因為 Windows Sockets 實作已卸載。

  • WSAENOBUFS Windows Sockets 實作會報告緩衝區死結。

  • WSAENOTCONN 通訊端未連線。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 1 或 2 之後 ShutDown ,就無法在通訊端上呼叫 Send

  • WSAEWOULDBLOCK 通訊端會標示為非封鎖,且所要求的作業會封鎖。

  • WSAEMSGSIZE 通訊端的類型 SOCK_DGRAM 為 ,而且資料包大於 Windows Sockets 實作所支援的最大數目。

  • WSAEINVAL 通訊端尚未與 Bind 系結。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

備註

Send 用來在連接的資料流程或資料包通訊端上寫入傳出資料。 對於資料包通訊端,必須小心不要超過基礎子網的 IP 封包大小上限,而此大小是由 所 iMaxUdpDg 傳回 AfxSocketInit 之 結構中的 WSADATA 專案所指定。 如果資料太長而無法透過基礎通訊協定進行不可部分完成傳遞,則會透過 GetLastError 傳回錯誤 WSAEMSGSIZE ,而且不會傳輸任何資料。

請注意,對於資料包通訊端而言,成功完成 Send 並不會指出已成功傳遞資料。

在 類型的 SOCK_STREAM 物件上 CAsyncSocket ,寫入的位元組數目可以介於 1 到要求的長度之間,視本機和外部主機上的緩衝區可用性而定。

範例

請參閱 的 CAsyncSocket::OnSend 範例。

CAsyncSocket::SendTo

呼叫此成員函式,將資料傳送至特定目的地。

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

參數

lpBuf
緩衝區,包含要傳輸的資料。

nBufLen
以位元組為單位 lpBuf 的資料長度。

nHostPort
識別通訊端應用程式的埠。

lpszHostAddress
此物件所連接的通訊端網路位址:電腦名稱稱,例如 「ftp.microsoft.com」,或虛線數位,例如 「128.56.22.8」。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_DONTROUTE 指定資料不應受限於路由。 Windows Sockets 供應商可以選擇忽略此旗標。

  • MSG_OOB 傳送頻外資料( SOCK_STREAM 僅限)。

lpSockAddr
結構指標 SOCKADDR ,其中包含目標通訊端的位址。

nSockAddrLen
以位元組為單位 lpSockAddr 的位址長度。

傳回值

如果沒有發生錯誤, SendTo 則傳回傳送的字元總數。 (請注意,這可以小於 所 nBufLen 指出的數位。否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEACCES 要求的位址是廣播位址,但未設定適當的旗標。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEFAULTlpBuflpSockAddr 參數不是使用者位址空間的一部分,或 lpSockAddr 引數太小(小於結構的大小 SOCKADDR )。

  • WSAEINVAL 主機名稱無效。

  • WSAENETRESET 連線必須重設,因為 Windows Sockets 實作已卸載。

  • WSAENOBUFS Windows Sockets 實作會報告緩衝區死結。

  • WSAENOTCONN 通訊端未連接( SOCK_STREAM 僅限)。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 1 或 2 之後 ShutDown ,就無法在通訊端上呼叫 SendTo

  • WSAEWOULDBLOCK 通訊端會標示為非封鎖,且所要求的作業會封鎖。

  • WSAEMSGSIZE 通訊端的類型 SOCK_DGRAM 為 ,而且資料包大於 Windows Sockets 實作所支援的最大數目。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

  • WSAEADDRNOTAVAIL 指定的位址無法從本機電腦取得。

  • WSAEAFNOSUPPORT 指定系列中的位址無法與這個通訊端搭配使用。

  • WSAEDESTADDRREQ 需要目的地位址。

  • WSAENETUNREACH 目前無法從此主機連線到網路。

備註

SendTo 用於資料包或資料流程通訊端,並用來在通訊端上寫入傳出資料。 對於資料包通訊端,必須小心不要超過基礎子網的 IP 封包大小上限,此大小是由 iMaxUdpDg 所填入 結構中的 WSADATA 專案所 AfxSocketInit 提供。 如果資料太長而無法透過基礎通訊協定進行不可部分完成傳遞,則會傳回錯誤 WSAEMSGSIZE,而且不會傳輸任何資料。

請注意,成功完成 SendTo 並不會指出已成功傳遞資料。

SendTo 只在通訊端上使用 SOCK_DGRAM ,將資料包傳送至 參數所 lpSockAddr 識別的特定通訊端。

若要傳送廣播(僅限開啟 SOCK_DGRAM ),參數中的 lpSockAddr 位址應該使用特殊 IP 位址 INADDR_BROADCAST (定義于 Windows Sockets 標頭檔 WINSOCK.H )以及預期的埠號碼來建構。 或者,如果 lpszHostAddress 參數是 NULL ,則會將通訊端設定為廣播。 廣播資料包通常無法辨識,以超過可能發生片段的大小,這表示資料包的資料部分(不包括標頭)不應超過 512 個位元組。

若要處理 IPv6 位址,請使用 CAsyncSocket::SendToEx

CAsyncSocket::SendToEx

呼叫此成員函式,將資料傳送至特定目的地(處理 IPv6 位址)。

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

參數

lpBuf
緩衝區,包含要傳輸的資料。

nBufLen
以位元組為單位 lpBuf 的資料長度。

nHostPort
識別通訊端應用程式的埠。

lpszHostAddress
此物件所連接的通訊端網路位址:電腦名稱稱,例如 「ftp.microsoft.com」,或虛線數位,例如 「128.56.22.8」。

nFlags
指定呼叫的進行方式。 此函式的語意取決於通訊端選項和 nFlags 參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( | ):

  • MSG_DONTROUTE 指定資料不應受限於路由。 Windows Sockets 供應商可以選擇忽略此旗標。

  • MSG_OOB 傳送頻外資料( SOCK_STREAM 僅限)。

傳回值

如果沒有發生錯誤, SendToEx 則傳回傳送的字元總數。 (請注意,這可以小於 所 nBufLen 指出的數位。否則,會傳回 的值 SOCKET_ERROR ,而且可以呼叫 GetLastError 來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEACCES 要求的位址是廣播位址,但未設定適當的旗標。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEFAULTlpBuflpSockAddr 參數不是使用者位址空間的一部分,或 lpSockAddr 引數太小(小於結構的大小 SOCKADDR )。

  • WSAEINVAL 主機名稱無效。

  • WSAENETRESET 連線必須重設,因為 Windows Sockets 實作已卸載。

  • WSAENOBUFS Windows Sockets 實作會報告緩衝區死結。

  • WSAENOTCONN 通訊端未連接( SOCK_STREAM 僅限)。

  • WSAENOTSOCK 描述元不是通訊端。

  • WSAEOPNOTSUPPMSG_OOB 已指定 ,但通訊端不是 型別 SOCK_STREAM

  • WSAESHUTDOWN通訊端已關閉;在叫用 nHow 設定為 1 或 2 之後 ShutDown ,就無法在通訊端上呼叫 SendToEx

  • WSAEWOULDBLOCK 通訊端會標示為非封鎖,且所要求的作業會封鎖。

  • WSAEMSGSIZE 通訊端的類型 SOCK_DGRAM 為 ,而且資料包大於 Windows Sockets 實作所支援的最大數目。

  • WSAECONNABORTED 虛擬線路因逾時或其他失敗而中止。

  • WSAECONNRESET 虛擬線路已由遠端端重設。

  • WSAEADDRNOTAVAIL 指定的位址無法從本機電腦取得。

  • WSAEAFNOSUPPORT 指定系列中的位址無法與這個通訊端搭配使用。

  • WSAEDESTADDRREQ 需要目的地位址。

  • WSAENETUNREACH 目前無法從此主機連線到網路。

備註

這個方法與 CAsyncSocket::SendTo 處理 IPv6 位址以及較舊的通訊協定相同。

SendToEx 用於資料包或資料流程通訊端,並用來在通訊端上寫入傳出資料。 對於資料包通訊端,必須小心不要超過基礎子網的 IP 封包大小上限,此大小是由 iMaxUdpDg 所填入 結構中的 WSADATA 專案所 AfxSocketInit 提供。 如果資料太長而無法透過基礎通訊協定進行不可部分完成傳遞,則會傳回錯誤 WSAEMSGSIZE ,而且不會傳輸任何資料。

請注意,成功完成 SendToEx 並不會指出已成功傳遞資料。

SendToEx 只在通訊端上使用 SOCK_DGRAM ,將資料包傳送至 參數所 lpSockAddr 識別的特定通訊端。

若要傳送廣播(僅限開啟 SOCK_DGRAM ),參數中的 lpSockAddr 位址應該使用特殊 IP 位址 INADDR_BROADCAST (定義于 Windows Sockets 標頭檔 WINSOCK.H )以及預期的埠號碼來建構。 或者,如果 lpszHostAddress 參數是 NULL ,則會將通訊端設定為廣播。 廣播資料包通常無法辨識,以超過可能發生片段的大小,這表示資料包的資料部分(不包括標頭)不應超過 512 個位元組。

CAsyncSocket::SetSockOpt

呼叫這個成員函式以設定通訊端選項。

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

參數

nOptionName
要設定值的通訊端選項。

lpOptionValue
緩衝區的指標,其中提供所要求選項的值。

nOptionLen
以位元組為單位的 lpOptionValue 緩衝區大小。

nLevel
定義選項的層級;唯一支援的層級是 SOL_SOCKETIPPROTO_TCP

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEFAULTlpOptionValue 不在進程位址空間的有效部分中。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAEINVALnLevel 無效,或 中 lpOptionValue 的資訊無效。

  • WSAENETRESET設定時,連線已逾時 SO_KEEPALIVE

  • WSAENOPROTOOPT 選項未知或不受支援。 特別是 , SO_BROADCAST 在 類型的通訊端上不支援 ,而 SO_KEEPALIVESO_LINGERSO_DONTLINGERSOCK_STREAMSO_OOBINLINE 在 型 SOCK_DGRAM 別的通訊端上則不支援 。

  • WSAENOTCONN設定時 SO_KEEPALIVE 已重設連線。

  • WSAENOTSOCK 描述元不是通訊端。

備註

SetSockOpt 會設定與任何類型之通訊端相關聯的通訊端選項目前值,處於任何狀態。 雖然選項可以存在於多個通訊協定層級,但此規格只會定義存在於最上層「通訊端」層級的選項。 選項會影響通訊端作業,例如是否在一般資料流程中接收加速資料、是否可以在通訊端上傳送廣播訊息等等。

通訊端選項有兩種類型:可啟用或停用功能或行為的布林選項,以及需要整數值或結構的選項。 若要啟用布林選項, lpOptionValue 請指向非零整數。 若要停用選項,則 lpOptionValue 指向等於零的整數。 nOptionLen 應該等於 sizeof(BOOL) 布林選項。 針對其他選項, lpOptionValue 指向包含選項所需值的整數或結構,而 nOptionLen 是整數或結構的長度。

SO_LINGER 控制在通訊端 Close 上排入未傳送資料且呼叫 函式以關閉通訊端時所採取的動作。

根據預設,通訊端無法系結至 Bind 已在使用的本機位址。 不過,有時候,最好以這種方式「重複使用」位址。 由於每個連線都是透過本機和遠端位址的組合唯一識別的,因此只要遠端位址不同,將兩個通訊端系結至相同的本機位址並無問題。

若要通知 Windows Sockets 實 Bind 作,因為所需的位址已由另一個通訊端使用,因此不應該不允許通訊端上的呼叫,應用程式應該在發出 Bind 呼叫之前,先設定 SO_REUSEADDR 通訊端的通訊端選項。 請注意,選項只會在呼叫時 Bind 解譯:因此,在未系結至現有位址的通訊端上設定選項是不必要的(但無害的),而且在呼叫之後 Bind 設定或重設選項不會影響這個或任何其他通訊端。

應用程式可以藉由開啟 SO_KEEPALIVE 通訊端選項,要求 Windows Sockets 實作能夠在傳輸控制通訊協定 (TCP) 連線上使用「保持運作」封包。 Windows Sockets 實作不需要支援使用 keep-alives:如果確實如此,精確的語意是實作特定的,但應該符合 RFC 1122 的第 4.2.3.6 節:「網際網路主機的需求 — 通訊層」。如果因為「保持連線」而卸載連線,錯誤碼 WSAENETRESET 會傳回通訊端上任何進行中的呼叫,且任何後續呼叫都會失敗。 WSAENOTCONN

選項 TCP_NODELAY 會停用 Nagle 演算法。 Nagle 演算法可用來緩衝未驗證的傳送資料,以減少主機傳送的小封包數目,直到可以傳送完整大小的封包為止。 不過,對於某些應用程式,此演算法可能會妨礙效能,並 TCP_NODELAY 可用來將其關閉。 應用程式寫入器不應該設定 TCP_NODELAY ,除非這樣做的影響是充分理解和想要的,因為設定 TCP_NODELAY 可能會對網路效能產生重大負面影響。 TCP_NODELAY 是唯一支援使用層級的通訊端選項;所有其他選項都使用層級 IPPROTO_TCPSOL_SOCKET

如果選項是由應用程式設定, SO_DEBUG 則 Windows 通訊端的某些實作會提供輸出偵錯資訊。

支援 SetSockOpt 下列選項。 Type 會識別 所 lpOptionValue 定址的資料類型。

類型 意義
SO_BROADCAST BOOL 允許在通訊端上傳輸廣播訊息。
SO_DEBUG BOOL 記錄偵錯資訊。
SO_DONTLINGER BOOL 請勿封鎖 Close 等候傳送未傳送的資料。 設定此選項相當於將 設定為零的 設定 SO_LINGERl_onoff
SO_DONTROUTE BOOL 不要路由:直接傳送至介面。
SO_KEEPALIVE BOOL 傳送 keep-alives。
SO_LINGER struct LINGER 如果存在未傳送的資料,則為揮之 Close 不去。
SO_OOBINLINE BOOL 在一般資料流程中接收頻外資料。
SO_RCVBUF int 指定接收的緩衝區大小。
SO_REUSEADDR BOOL 允許通訊端系結至已在使用的位址。 (請參閱 Bind .)
SO_SNDBUF int 指定傳送的緩衝區大小。
TCP_NODELAY BOOL 停用用於傳送聯合的 Nagle 演算法。

Berkeley Software Distribution (BSD) 不支援 SetSockOpt 的選項如下:

類型 意義
SO_ACCEPTCONN BOOL 通訊端正在接聽
SO_ERROR int 取得錯誤狀態並清除。
SO_RCVLOWAT int 接收低水位標記。
SO_RCVTIMEO int 接收逾時
SO_SNDLOWAT int 傳送低浮水印。
SO_SNDTIMEO int 傳送逾時。
SO_TYPE int 通訊端的類型。
IP_OPTIONS 在 IP 標頭中設定選項欄位。

CAsyncSocket::ShutDown

呼叫此成員函式以停用通訊端上的傳送、接收或兩者。

BOOL ShutDown(int nHow = sends);

參數

nHow
使用下列列舉值,描述不再允許作業類型的旗標:

  • receives = 0

  • sends = 1

  • 兩者 = 2

傳回值

如果函式成功,則為非零;否則,您可以呼叫 GetLastError 來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用于此成員函式:

  • WSANOTINITIALISED 使用這個 API 之前,必須先成功 AfxSocketInit 發生。

  • WSAENETDOWN Windows Sockets 實作偵測到網路子系統失敗。

  • WSAEINVALnHow 無效。

  • WSAEINPROGRESS 封鎖的 Windows 通訊端作業正在進行中。

  • WSAENOTCONN 通訊端未連接( SOCK_STREAM 僅限)。

  • WSAENOTSOCK 描述元不是通訊端。

備註

ShutDown 用於所有類型的通訊端,以停用接收、傳輸或兩者。 如果 nHow 為 0,則不允許通訊端上的後續接收。 這不會影響較低的通訊協定層。

對於傳輸控制通訊協定(TCP),TCP 視窗不會變更,而且在視窗用盡之前,將接受傳入資料(但未認可)。 針對使用者資料包通訊協定 (UDP),會接受傳入資料包並排入佇列。 絕不會產生 ICMP 錯誤封包。 如果 nHow 為 1,則不允許後續傳送。 針對 TCP 通訊端,將會傳送 FIN。 將 設定 nHow 為 2 會停用傳送和接收,如上所述。

請注意, ShutDown 不會關閉通訊端,而且在呼叫 之前 Close ,不會釋放連結至通訊端的資源。 應用程式不應該依賴在關閉通訊端之後重複使用通訊端。 特別是,Windows Sockets 實作不需要支援 Connect 在這類通訊端上使用 。

範例

請參閱 的 CAsyncSocket::OnReceive 範例。

CASyncSocket::Socket

配置通訊端控制碼。

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

參數

nSocketType
指定 SOCK_STREAMSOCK_DGRAM

lEvent
位元遮罩,指定應用程式感興趣的網路事件組合。

  • FD_READ:想要接收閱讀整備的通知。

  • FD_WRITE:想要接收準備寫入的通知。

  • FD_OOB:想要接收頻外資料抵達的通知。

  • FD_ACCEPT:想要接收連入連線的通知。

  • FD_CONNECT:想要接收已完成連線的通知。

  • FD_CLOSE:想要接收通訊端關閉的通知。

nProtocolType
要與指定位址系列專屬之通訊端搭配使用的通訊協定。

nAddressFormat
位址系列規格。

傳回值

成功時傳回 TRUE,失敗時則傳回 FALSE

備註

這個方法會配置通訊端控制碼。 它不會呼叫 CAsyncSocket::Bind 將通訊端系結至指定的位址,因此您必須稍後呼叫 Bind ,才能將通訊端系結至指定的位址。 在系結通訊端選項之前,您可以使用 CAsyncSocket::SetSockOpt 來設定通訊端選項。

另請參閱

CObject
階層架構圖表
CSocket
CSocketFile