共用方式為


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錯誤,應用程式必須先呼叫 AsyncSelect lEvent 等於 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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

呼叫此成員函式以接收數據報,並將來源位址儲存在 結構或 中 SOCKADDR rSocketAddress (處理 IPv6 位址)。

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

參數

lpBuf
傳入數據的緩衝區。

nBufLen
位元組的 lpBuf 長度。

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

rSocketPort
UINT儲存埠的 參考。

nFlags
指定呼叫的進行方式。 此函式的語意取決於套接字選項和 nFlags 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++|

  • 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