代表 Windows 套接字 - 網路通訊的端點。
語法
class CAsyncSocket : public CObject
成員
公用建構函式
| 名稱 | 描述 |
|---|---|
CAsyncSocket::CAsyncSocket |
建構 CAsyncSocket 物件。 |
公用方法
受保護的方法
| 名稱 | 描述 |
|---|---|
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 只會在主要線程中呼叫 。
如需詳細資訊,請參閱 CAsyncSocket和相關文章。以及 Windows Sockets 2 API。
繼承階層架構
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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數太小(小於結構的大小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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEINVAL表示其中一個指定的參數無效。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。
備註
此函式用來指定將針對套接字呼叫哪些 MFC 回呼通知函式。
AsyncSelect 會自動將此套接字設定為非封鎖模式。 如需詳細資訊,請參閱 Windows 套接字:套接字通知一文。
CAsyncSocket::Attach
呼叫這個成員函式,將句柄附加 hSocket 至 CAsyncSocket 物件。
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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEADDRINUSE指定的位址已在使用中。 (請參閱 下方SO_REUSEADDR的SetSockOpt套接字選項。WSAEFAULT自nSockAddrLen變數太小(小於結構的大小SOCKADDR)。WSAEINPROGRESS封鎖的 Windows Sockets 呼叫正在進行中。WSAEAFNOSUPPORT此埠不支援指定的位址系列。WSAEINVAL套接字已系結至位址。WSAENOBUFS沒有足夠的緩衝區可用,太多連線。WSAENOTSOCK描述元不是套接字。
備註
此例程會在後續 Connect 或 Listen 呼叫之前,用於未連接的數據報或數據流套接字上。 在接受連線要求之前,接聽伺服器套接字必須選取埠號碼,並藉由呼叫 Bind來讓 Windows 套接字知道。
Bind 將本機名稱指派給未命名的套接字,以建立套接字的本機關聯(主機位址/埠號碼)。
CAsyncSocket::CAsyncSocket
建構空白套接字物件。
CAsyncSocket();
備註
建構 物件之後,您必須呼叫其 Create 成員函式來建立 SOCKET 數據結構並系結其位址。 (在 Windows Sockets 通訊的伺服器端,當接聽套接字建立要用於呼叫的 Accept 套接字時,您不會針對該套接字呼叫 Create 。
CAsyncSocket::Close
關閉套接字。
virtual void Close();
備註
此函式會釋放套接字描述元,讓對它的進一步參考失敗,並出現錯誤 WSAENOTSOCK。 如果這是基礎套接字的最後一個參考,則會捨棄相關聯的命名資訊和佇列數據。 套接字物件的解構函式會為您呼叫 Close 。
針對 CAsyncSocket,但不適用於 CSocket,的語 Close 意會受到套接字選項 SO_LINGER 和 SO_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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEADDRINUSE指定的位址已在使用中。WSAEINPROGRESS封鎖的 Windows Sockets 呼叫正在進行中。WSAEADDRNOTAVAIL指定的位址無法從本機計算機取得。WSAEAFNOSUPPORT指定系列中的位址無法與這個套接字搭配使用。WSAECONNREFUSED嘗試連線遭到拒絕。WSAEDESTADDRREQ需要目的地位址。WSAEFAULT自nSockAddrLen變數不正確。WSAEINVAL無效的主機位址。WSAEISCONN套接字已連線。WSAEMFILE沒有其他檔案描述項可供使用。WSAENETUNREACH目前無法從此主機連線到網路。WSAENOBUFS沒有可用的緩衝區空間。 套接字無法連接。WSAENOTSOCK描述元不是套接字。WSAETIMEDOUT嘗試連線逾時,而不建立連線。WSAEWOULDBLOCK套接字標示為非封鎖,且無法立即完成連線。
備註
如果套接字未系結,系統會將唯一值指派給本機關聯,而且套接字會標示為系結。 請注意,如果名稱結構的位址字段全部為零, Connect 則會傳回零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError 成員函式。
針對數據流套接字(類型 SOCK_STREAM),會起始對外部主機的作用中聯機。 套接字呼叫順利完成時,套接字已準備好傳送/接收數據。
若為數據報套接字(類型 SOCK_DGRAM),則會設定預設目的地,以供後續 Send 和 Receive 呼叫使用。
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_STREAM 或 SOCK_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發生。WSAENETDOWNWindows 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數據成員m_hSocket中的CAsyncSocket句柄,並將 設定m_hSocket為 NULL。
SOCKET Detach();
CAsyncSocket::FromHandle
傳回 物件的指標 CAsyncSocket 。
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
參數
hSocket
包含套接字的句柄。
傳回值
物件的指標CAsyncSocket,如果沒有附加至 NULL的物件,CAsyncSocket則hSocket為 。
備註
指定 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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數不夠大。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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數不夠大。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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數不夠大。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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數不夠大。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_SOCKET 和 IPPROTO_TCP。
傳回值
如果函式成功,則為非零;否則,您可以呼叫 GetLastError來擷取 0,並擷取特定的錯誤碼。 如果從未使用 SetSockOpt設定選項,則會 GetSockOpt 傳回選項的預設值。 下列錯誤適用於此成員函式:
WSANOTINITIALISED使用這個 API 之前,必須先成功AfxSocketInit發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpOptionLen變數無效。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAENOPROTOOPT選項未知或不受支援。 特別是 ,SO_BROADCAST在類型的套接字上不支援 ,而SOCK_STREAM類型SO_ACCEPTCONNSO_DONTLINGER為的套接字不支援、SO_KEEPALIVESO_LINGERSO_OOBINLINE、 和 。SOCK_DGRAMWSAENOTSOCK描述元不是套接字。
備註
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會導致從 WSAENOPROTOOPT傳回錯誤碼GetLastError。
CAsyncSocket::IOCtl
呼叫這個成員函式來控制套接字的模式。
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
參數
lCommand
在套接字上執行的命令。
lpArgument
的 lCommand參數指標。
傳回值
如果函式成功,則為非零;否則,您可以呼叫 GetLastError來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用於此成員函式:
WSANOTINITIALISED使用這個 API 之前,必須先成功AfxSocketInit發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEINVALlCommand不是有效的命令,或lpArgument不是 可接受的lCommand參數,或命令不適用於提供的套接字類型。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAENOTSOCK描述元不是套接字。
備註
此例程可在任何狀態的任何套接字上使用。 它用來取得或擷取與套接字相關聯的作業參數,與通訊協定和通訊子系統無關。 支援下列命令:
FIONBIO在套接字上啟用或停用非封鎖模式。 參數lpArgument指向DWORD,如果啟用非封鎖模式,則為非零,如果停用則為零。 如果AsyncSelect已在套接字上發出,則任何將IOCtl套接字設定回封鎖模式的嘗試都會失敗。WSAEINVAL若要將套接字設定回封鎖模式並防止WSAEINVAL錯誤,應用程式必須先呼叫AsyncSelectAsyncSelect等於 0 的參數來停用lEvent,然後呼叫IOCtl。FIONREAD決定可從這個套接字使用一個Receive呼叫讀取的最大位元元組數目。 參數lpArgument會指向DWORD儲存IOCtl結果的 。 如果此套接字的類型SOCK_STREAM為 ,FIONREAD會傳回可在單Receive一讀取的數據總量;這通常與套接字上排入佇列的數據總量相同。 如果此套接字的類型SOCK_DGRAM為 ,FIONREAD則傳回套接字上排入佇列的第一個數據報大小。SIOCATMARK判斷是否已讀取所有頻外數據。 這隻適用於已針對任何頻外數據進行內嵌接收的型SOCK_STREAM別套接字(SO_OOBINLINE)。 如果沒有頻外數據正在等候讀取,作業會傳回非零。 否則會傳回 0,而套接字上執行的下一個Receive或ReceiveFrom執行將會擷取部分或所有數據之前「標記」;應用程式應該使用SIOCATMARK作業來判斷是否有任何數據保留。 如果「緊急」(頻外)數據之前有任何一般數據,則會依序接收。 (請注意,Receive或ReceiveFrom永遠不會在相同呼叫中混用頻外和一般數據。參數lpArgument會指向DWORD儲存IOCtl結果的 。
此函式是 伯克利套接字中使用的 子集 ioctl() 。 特別是沒有相當於 FIOASYNC的命令,而 SIOCATMARK 是唯一支援的套接字層級命令。
CAsyncSocket::Listen
呼叫此成員函式以接聽連入連線要求。
BOOL Listen(int nConnectionBacklog = 5);
參數
nConnectionBacklog
暫止連線佇列可以成長的最大長度。 有效範圍從 1 到 5。
傳回值
如果函式成功,則為非零;否則,您可以呼叫 GetLastError來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用於此成員函式:
WSANOTINITIALISED使用這個 API 之前,必須先成功AfxSocketInit發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEADDRINUSE已嘗試接聽使用中的位址。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEINVAL套接字尚未系結或Bind已連線。WSAEISCONN套接字已連線。WSAEMFILE沒有其他檔案描述項可供使用。WSAENOBUFS沒有可用的緩衝區空間。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPP參考的套接字不是支援作業的類型Listen。
備註
若要接受連線,會先使用 Create建立套接字,使用 指定 Listen內送連線的待處理專案,然後使用 接受 Accept連接。
Listen 僅適用於支持連線的套接字,也就是類型 SOCK_STREAM為的套接字。 此套接字會進入「被動」模式,其中傳入聯機會得到認可,並排入進程等待接受的佇列。
伺服器(或任何想要接受連線的應用程式)通常會使用此函式,一次可以有多個連線要求:如果連線要求到達佇列已滿,用戶端會收到錯誤,並指出 WSAECONNREFUSED。
Listen 當沒有可用的埠(描述項)時,嘗試繼續理性地運作。 它會接受連線,直到佇列清空為止。 如果埠可供使用,稍後呼叫 Listen 或 Accept 會盡可能將佇列重新填入至目前或最新的「待辦專案」,並繼續接聽連入連線。
CAsyncSocket::m_hSocket
包含 SOCKET 這個 CAsyncSocket 物件所封裝之套接字的句柄。
SOCKET m_hSocket;
CAsyncSocket::OnAccept
由架構呼叫,以通知接聽套接字,它可藉由呼叫成員函式來接受擱置的 Accept 連線要求。
virtual void OnAccept(int nErrorCode);
參數
nErrorCode
套接字上最近的錯誤。 下列錯誤碼適用於 OnAccept 成員函式:
0 函式已成功執行。
WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。
備註
如需詳細資訊,請參閱 Windows 套接字:套接字通知。
CAsyncSocket::OnClose
由架構呼叫,以通知此套接字連線的套接字已由其進程關閉。
virtual void OnClose(int nErrorCode);
參數
nErrorCode
套接字上最近的錯誤。 下列錯誤碼適用於 OnClose 成員函式:
0 函式已成功執行。
WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAECONNRESET線上已由遠端端重設。WSAECONNABORTED線上因為逾時或其他失敗而中止。
備註
如需詳細資訊,請參閱 Windows 套接字:套接字通知。
CAsyncSocket::OnConnect
由架構呼叫,通知此連接套接字其連線嘗試已完成,無論是成功還是發生錯誤。
virtual void OnConnect(int nErrorCode);
參數
nErrorCode
套接字上最近的錯誤。 下列錯誤碼適用於 OnConnect 成員函式:
0 函式已成功執行。
WSAEADDRINUSE指定的位址已在使用中。WSAEADDRNOTAVAIL指定的位址無法從本機計算機取得。WSAEAFNOSUPPORT指定系列中的位址無法與這個套接字搭配使用。WSAECONNREFUSED嘗試連線時遭到強制拒絕。WSAEDESTADDRREQ需要目的地位址。WSAEFAULT自lpSockAddrLen變數不正確。WSAEINVAL套接字已系結至位址。WSAEISCONN套接字已連線。WSAEMFILE沒有其他檔案描述項可供使用。WSAENETUNREACH目前無法從此主機連線到網路。WSAENOBUFS沒有可用的緩衝區空間。 套接字無法連接。WSAENOTCONN套接字未連線。WSAENOTSOCK描述項是檔案,而不是套接字。WSAETIMEDOUT嘗試連線逾時,而不需建立連線。
備註
注意
在 中 CSocket, OnConnect 永遠不會呼叫通知函式。 針對連線,您只需呼叫 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 函式已成功執行。
WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。
備註
頻外數據是邏輯上獨立的通道,與類型的 SOCK_STREAM每個連線套接字組相關聯。 通道通常用來傳送緊急數據。
MFC 支援頻外數據,但不建議使用類別 CAsyncSocket 的使用者。 最簡單的方式是建立第二個套接字來傳遞這類數據。 如需頻外數據的詳細資訊,請參閱 Windows 套接字:套接字通知。
CAsyncSocket::OnReceive
由架構呼叫,以通知這個套接字,緩衝區中有數據可藉由呼叫 Receive 成員函式來擷取。
virtual void OnReceive(int nErrorCode);
參數
nErrorCode
套接字上最近的錯誤。 下列錯誤碼適用於 OnReceive 成員函式:
0 函式已成功執行。
WSAENETDOWNWindows 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 函式已成功執行。
WSAENETDOWNWindows 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;
傳回值
如果成功,則為物件的句柄 SOCKET , NULL否則為 。
備註
您可以使用 句柄直接呼叫 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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAENOTCONN套接字未連線。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用Receive設定為 0 或 2 之後ShutDown,就無法在套接字上呼叫nHow。WSAEWOULDBLOCK套接字標示為非封鎖,且Receive作業會封鎖。WSAEMSGSIZE數據報太大而無法放入指定的緩衝區,而且已截斷。WSAEINVAL套接字尚未與Bind系結。WSAECONNABORTED虛擬線路因逾時或其他失敗而中止。WSAECONNRESET虛擬線路已由遠端端重設。
備註
此函式用於連接的數據流或數據報套接字,並用來讀取傳入數據。
針對類型的 SOCK_STREAM套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外數據。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入數據報的第一個部分、遺失多餘的數據,並傳回的值,並將Receive錯誤碼設定為 SOCKET_ERROR。WSAEMSGSIZE 如果套接字上沒有可用的傳入資料,則會傳回 值 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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數無效:lpSockAddr緩衝區太小,無法容納對等位址。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEINVAL套接字尚未與Bind系結。WSAENOTCONN套接字未連接(SOCK_STREAM僅限)。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用ReceiveFrom設定為 0 或 2 之後ShutDown,就無法在套接字上呼叫nHow。WSAEWOULDBLOCK套接字標示為非封鎖,且ReceiveFrom作業會封鎖。WSAEMSGSIZE數據報太大而無法放入指定的緩衝區,而且已截斷。WSAECONNABORTED虛擬線路因逾時或其他失敗而中止。WSAECONNRESET虛擬線路已由遠端端重設。
備註
此函式用來讀取 (可能連線) 套接字上的傳入數據,並擷取數據從中傳送的位址。
若要處理 IPv6 位址, 請使用 CAsyncSocket::ReceiveFromEx。
針對類型的 SOCK_STREAM套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外數據。 套接字lpSockAddr會lpSockAddrLen忽略 和 SOCK_STREAM 參數。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的數據,並傳回 值,並將ReceiveFrom錯誤碼設定為SOCKET_ERROR。WSAEMSGSIZE
如果 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 參數。 後者的建構方式是結合下列任何值與位 OR 運算符C++:|
MSG_PEEK查看傳入的數據。 數據會複製到緩衝區,但不會從輸入佇列中移除。MSG_OOB處理頻外數據。
傳回值
如果沒有發生錯誤, ReceiveFromEx 則傳回收到的位元元組數目。 如果連接已關閉,則會傳回 0。 否則,會傳回的值 SOCKET_ERROR ,而且可以呼叫 GetLastError來擷取特定的錯誤碼。 下列錯誤適用於此成員函式:
WSANOTINITIALISED使用這個 API 之前,必須先成功AfxSocketInit發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULT自lpSockAddrLen變數無效:lpSockAddr緩衝區太小,無法容納對等位址。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEINVAL套接字尚未與Bind系結。WSAENOTCONN套接字未連接(SOCK_STREAM僅限)。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用ReceiveFromEx設定為 0 或 2 之後ShutDown,就無法在套接字上呼叫nHow。WSAEWOULDBLOCK套接字標示為非封鎖,且ReceiveFromEx作業會封鎖。WSAEMSGSIZE數據報太大而無法放入指定的緩衝區,而且已截斷。WSAECONNABORTED虛擬線路因逾時或其他失敗而中止。WSAECONNRESET虛擬線路已由遠端端重設。
備註
此函式用來讀取 (可能連線) 套接字上的傳入數據,並擷取數據從中傳送的位址。
此函式與 CAsyncSocket::ReceiveFrom 處理 IPv6 位址和較舊的通訊協定相同。
針對類型的 SOCK_STREAM套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK 選項,或 OnOutOfBandData 判斷是否要讀取更多頻外數據。 套接字lpSockAddr會lpSockAddrLen忽略 和 SOCK_STREAM 參數。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的數據,並傳回 值,並將ReceiveFromEx錯誤碼設定為SOCKET_ERROR。WSAEMSGSIZE
如果 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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEACCES要求的位址是廣播位址,但未設定適當的旗標。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEFAULT自lpBuf變數不在用戶位址空間的有效部分中。WSAENETRESET聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFSWindows Sockets 實作會報告緩衝區死結。WSAENOTCONN套接字未連線。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用Send設定為 1 或 2 之後ShutDown,就無法在套接字上呼叫nHow。WSAEWOULDBLOCK套接字會標示為非封鎖,且所要求的作業會封鎖。WSAEMSGSIZE套接字的類型SOCK_DGRAM為 ,而且數據報大於 Windows Sockets 實作所支援的最大數目。WSAEINVAL套接字尚未與Bind系結。WSAECONNABORTED虛擬線路因逾時或其他失敗而中止。WSAECONNRESET虛擬線路已由遠端端重設。
備註
Send 用來在連接的數據流或數據報套接字上寫入傳出數據。 對於數據報套接字,必須小心不要超過基礎子網的IP封包大小上限,而此大小是由所iMaxUdpDg傳回WSADATA之結構中的 AfxSocketInit 專案所指定。 如果數據太長而無法透過基礎通訊協議進行不可部分完成傳遞,則會透過 WSAEMSGSIZE傳回錯誤GetLastError,而且不會傳輸任何數據。
請注意,對於數據報套接字而言,成功完成 Send 並不會指出已成功傳遞數據。
在類型的CAsyncSocket物件上SOCK_STREAM,寫入的位元組數目可以介於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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEACCES要求的位址是廣播位址,但未設定適當的旗標。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEFAULTlpBuf或lpSockAddr參數不是使用者位址空間的一部分,或lpSockAddr自變數太小(小於結構的大小SOCKADDR)。WSAEINVAL主機名無效。WSAENETRESET聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFSWindows Sockets 實作會報告緩衝區死結。WSAENOTCONN套接字未連接(SOCK_STREAM僅限)。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用SendTo設定為 1 或 2 之後ShutDown,就無法在套接字上呼叫nHow。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發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEACCES要求的位址是廣播位址,但未設定適當的旗標。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEFAULTlpBuf或lpSockAddr參數不是使用者位址空間的一部分,或lpSockAddr自變數太小(小於結構的大小SOCKADDR)。WSAEINVAL主機名無效。WSAENETRESET聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFSWindows Sockets 實作會報告緩衝區死結。WSAENOTCONN套接字未連接(SOCK_STREAM僅限)。WSAENOTSOCK描述元不是套接字。WSAEOPNOTSUPPMSG_OOB已指定 ,但套接字不是 型別SOCK_STREAM。WSAESHUTDOWN套接字已關閉;在叫用SendToEx設定為 1 或 2 之後ShutDown,就無法在套接字上呼叫nHow。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_SOCKET 和 IPPROTO_TCP。
傳回值
如果函式成功,則為非零;否則,您可以呼叫 GetLastError來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用於此成員函式:
WSANOTINITIALISED使用這個 API 之前,必須先成功AfxSocketInit發生。WSAENETDOWNWindows Sockets 實作偵測到網路子系統失敗。WSAEFAULTlpOptionValue不在行程位址空間的有效部分中。WSAEINPROGRESS封鎖的 Windows 套接字作業正在進行中。WSAEINVALnLevel無效,或中的lpOptionValue資訊無效。WSAENETRESET設定時,連線已逾時SO_KEEPALIVE。WSAENOPROTOOPT選項未知或不受支援。 特別是 ,SO_BROADCAST在類型的套接字上不支援 ,而SOCK_STREAMSO_DONTLINGERSO_KEEPALIVE、SO_LINGER和SO_OOBINLINE在 型SOCK_DGRAM別的套接字上則不支援 。WSAENOTCONN設定時SO_KEEPALIVE,已重設連線。WSAENOTSOCK描述元不是套接字。
備註
SetSockOpt 會設定與任何類型之套接字相關聯的套接字選項目前值,處於任何狀態。 雖然選項可以存在於多個通訊協定層級,但此規格只會定義存在於最上層「套接字」層級的選項。 選項會影響套接字作業,例如是否在一般數據流中接收加速數據、是否可以在套接字上傳送廣播訊息等等。
套接字選項有兩種類型:可啟用或停用功能或行為的布爾選項,以及需要整數值或結構的選項。 若要啟用布爾選項, lpOptionValue 請指向非零整數。 若要停用選項,則 lpOptionValue 指向等於零的整數。
nOptionLen 應該等於 sizeof(BOOL) 布爾選項。 針對其他選項, lpOptionValue 指向包含選項所需值的整數或結構,而 nOptionLen 是整數或結構的長度。
SO_LINGER 控制在套接字 Close 上排入未傳送數據且呼叫 函式以關閉套接字時所採取的動作。
根據預設,套接字無法系結至 Bind已在使用的本機位址。 不過,有時候,最好以這種方式「重複使用」位址。 由於每個連線都是透過本機和遠端位址的組合唯一識別的,因此只要遠端位址不同,將兩個套接字系結至相同的本機位址並無問題。
若要通知 Windows Sockets 實Bind作,因為所需的位址已由另一個套接字使用,因此不應該不允許套接字上的呼叫,應用程式應該在發出SO_REUSEADDR呼叫之前,先設定Bind套接字的套接字選項。 請注意,選項只會在呼叫時 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發生。WSAENETDOWNWindows 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_STREAM 或 SOCK_DGRAM。
lEvent
位掩碼,指定應用程式感興趣的網路事件組合。
FD_READ:想要接收閱讀整備的通知。FD_WRITE:想要接收準備寫入的通知。FD_OOB:想要接收頻外數據抵達的通知。FD_ACCEPT:想要接收連入連線的通知。FD_CONNECT:想要接收已完成連線的通知。FD_CLOSE:想要接收套接字關閉的通知。
nProtocolType
要與指定位址系列專屬之套接字搭配使用的通訊協定。
nAddressFormat
位址系列規格。
傳回值
成功時傳回 TRUE,失敗時則傳回 FALSE。
備註
這個方法會配置套接字句柄。 它不會呼叫 CAsyncSocket::Bind 將套接字系結至指定的位址,因此您必須稍後呼叫 Bind ,才能將套接字系結至指定的位址。 在系結套接字選項之前,您可以使用 CAsyncSocket::SetSockOpt 來設定套接字選項。