CAsyncSocket
類別
代表 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
只會在主要線程中呼叫 。
如需詳細資訊,請參閱 Windows 套接字:使用類別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
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAEFAULT
自lpSockAddrLen
變數太小(小於結構的大小SOCKADDR
)。WSAEINPROGRESS
封鎖的 Windows Sockets 呼叫正在進行中。WSAEINVAL
Listen
在接受之前未叫用 。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
呼叫這個成員函式,將句柄附加 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
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAEADDRINUSE
指定的位址已在使用中。 (請參閱 下方SetSockOpt
的SO_REUSEADDR
套接字選項。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
發生。WSAENETDOWN
Windows 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
發生。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_hSocket
為 NULL
。
SOCKET Detach();
CAsyncSocket::FromHandle
傳回 物件的指標 CAsyncSocket
。
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
參數
hSocket
包含套接字的句柄。
傳回值
物件的指標CAsyncSocket
,如果沒有附加至 hSocket
的物件,NULL
則CAsyncSocket
為 。
備註
指定 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 實作偵測到網路子系統失敗。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
發生。WSAENETDOWN
Windows 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
發生。WSAENETDOWN
Windows 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
發生。WSAENETDOWN
Windows 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
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAEFAULT
自lpOptionLen
變數無效。WSAEINPROGRESS
封鎖的 Windows 套接字作業正在進行中。WSAENOPROTOOPT
選項未知或不受支援。 特別是 ,SO_BROADCAST
在類型的套接字上不支援 ,而SO_ACCEPTCONN
類型SOCK_STREAM
SOCK_DGRAM
為的套接字不支援、SO_DONTLINGER
SO_KEEPALIVE
SO_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 實作偵測到網路子系統失敗。WSAEINVAL
lCommand
不是有效的命令,或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,而套接字上執行的下一個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
發生。WSAENETDOWN
Windows 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 函式已成功執行。
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
需要目的地位址。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 函式已成功執行。
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;
傳回值
如果成功,則為物件的句柄 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
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAENOTCONN
套接字未連線。WSAEINPROGRESS
封鎖的 Windows 套接字作業正在進行中。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_OOB
已指定 ,但套接字不是 型別SOCK_STREAM
。WSAESHUTDOWN
套接字已關閉;在叫用nHow
設定為 0 或 2 之後ShutDown
,就無法在套接字上呼叫Receive
。WSAEWOULDBLOCK
套接字標示為非封鎖,且Receive
作業會封鎖。WSAEMSGSIZE
數據報太大而無法放入指定的緩衝區,而且已截斷。WSAEINVAL
套接字尚未與Bind
系結。WSAECONNABORTED
虛擬線路因逾時或其他失敗而中止。WSAECONNRESET
虛擬線路已由遠端端重設。
備註
此函式用於連接的數據流或數據報套接字,並用來讀取傳入數據。
針對類型的 SOCK_STREAM
套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE
)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK
選項,或 OnOutOfBandData
判斷是否要讀取更多頻外數據。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入數據報的第一個部分、遺失多餘的數據,並傳回的值,並將Receive
錯誤碼設定為 WSAEMSGSIZE
。SOCKET_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 實作偵測到網路子系統失敗。WSAEFAULT
自lpSockAddrLen
變數無效:lpSockAddr
緩衝區太小,無法容納對等位址。WSAEINPROGRESS
封鎖的 Windows 套接字作業正在進行中。WSAEINVAL
套接字尚未與Bind
系結。WSAENOTCONN
套接字未連接(SOCK_STREAM
僅限)。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_OOB
已指定 ,但套接字不是 型別SOCK_STREAM
。WSAESHUTDOWN
套接字已關閉;在叫用nHow
設定為 0 或 2 之後ShutDown
,就無法在套接字上呼叫ReceiveFrom
。WSAEWOULDBLOCK
套接字標示為非封鎖,且ReceiveFrom
作業會封鎖。WSAEMSGSIZE
數據報太大而無法放入指定的緩衝區,而且已截斷。WSAECONNABORTED
虛擬線路因逾時或其他失敗而中止。WSAECONNRESET
虛擬線路已由遠端端重設。
備註
此函式用來讀取 (可能連線) 套接字上的傳入數據,並擷取數據從中傳送的位址。
若要處理 IPv6 位址, 請使用 CAsyncSocket::ReceiveFromEx
。
針對類型的 SOCK_STREAM
套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE
)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK
選項,或 OnOutOfBandData
判斷是否要讀取更多頻外數據。 套接字lpSockAddr
會SOCK_STREAM
忽略 和 lpSockAddrLen
參數。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的數據,並傳回 值,並將ReceiveFrom
錯誤碼設定為WSAEMSGSIZE
。SOCKET_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 實作偵測到網路子系統失敗。WSAEFAULT
自lpSockAddrLen
變數無效:lpSockAddr
緩衝區太小,無法容納對等位址。WSAEINPROGRESS
封鎖的 Windows 套接字作業正在進行中。WSAEINVAL
套接字尚未與Bind
系結。WSAENOTCONN
套接字未連接(SOCK_STREAM
僅限)。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_OOB
已指定 ,但套接字不是 型別SOCK_STREAM
。WSAESHUTDOWN
套接字已關閉;在叫用nHow
設定為 0 或 2 之後ShutDown
,就無法在套接字上呼叫ReceiveFromEx
。WSAEWOULDBLOCK
套接字標示為非封鎖,且ReceiveFromEx
作業會封鎖。WSAEMSGSIZE
數據報太大而無法放入指定的緩衝區,而且已截斷。WSAECONNABORTED
虛擬線路因逾時或其他失敗而中止。WSAECONNRESET
虛擬線路已由遠端端重設。
備註
此函式用來讀取 (可能連線) 套接字上的傳入數據,並擷取數據從中傳送的位址。
此函式與 CAsyncSocket::ReceiveFrom
處理 IPv6 位址和較舊的通訊協定相同。
針對類型的 SOCK_STREAM
套接字,會傳回目前可用到所提供緩衝區大小的相同資訊。 如果已針對頻外數據(套接字選項 SO_OOBINLINE
)和頻外數據的內嵌接收設定套接字未讀取,則只會傳回頻外數據。 應用程式可以使用 IOCtlSIOCATMARK
選項,或 OnOutOfBandData
判斷是否要讀取更多頻外數據。 套接字lpSockAddr
會SOCK_STREAM
忽略 和 lpSockAddrLen
參數。
針對數據報套接字,數據會從第一個加入佇列的數據報擷取,最多可擷取到提供的緩衝區大小。 如果數據報大於提供的緩衝區,則緩衝區會填入訊息的第一個部分、遺失多餘的數據,並傳回 值,並將ReceiveFromEx
錯誤碼設定為WSAEMSGSIZE
。SOCKET_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 套接字作業正在進行中。WSAEFAULT
自lpBuf
變數不在用戶位址空間的有效部分中。WSAENETRESET
聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFS
Windows Sockets 實作會報告緩衝區死結。WSAENOTCONN
套接字未連線。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_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 套接字作業正在進行中。WSAEFAULT
lpBuf
或lpSockAddr
參數不是使用者位址空間的一部分,或lpSockAddr
自變數太小(小於結構的大小SOCKADDR
)。WSAEINVAL
主機名無效。WSAENETRESET
聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFS
Windows Sockets 實作會報告緩衝區死結。WSAENOTCONN
套接字未連接(SOCK_STREAM
僅限)。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_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 套接字作業正在進行中。WSAEFAULT
lpBuf
或lpSockAddr
參數不是使用者位址空間的一部分,或lpSockAddr
自變數太小(小於結構的大小SOCKADDR
)。WSAEINVAL
主機名無效。WSAENETRESET
聯機必須重設,因為 Windows Sockets 實作已卸除。WSAENOBUFS
Windows Sockets 實作會報告緩衝區死結。WSAENOTCONN
套接字未連接(SOCK_STREAM
僅限)。WSAENOTSOCK
描述元不是套接字。WSAEOPNOTSUPP
MSG_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_SOCKET
和 IPPROTO_TCP
。
傳回值
如果函式成功,則為非零;否則,您可以呼叫 GetLastError
來擷取 0,並擷取特定的錯誤碼。 下列錯誤適用於此成員函式:
WSANOTINITIALISED
使用這個 API 之前,必須先成功AfxSocketInit
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAEFAULT
lpOptionValue
不在行程位址空間的有效部分中。WSAEINPROGRESS
封鎖的 Windows 套接字作業正在進行中。WSAEINVAL
nLevel
無效,或中的lpOptionValue
資訊無效。WSAENETRESET
設定時,連線已逾時SO_KEEPALIVE
。WSAENOPROTOOPT
選項未知或不受支援。 特別是 ,SO_BROADCAST
在類型的套接字上不支援 ,而SO_KEEPALIVE
SO_LINGER
SO_DONTLINGER
、SOCK_STREAM
和SO_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_TCP
SOL_SOCKET
。
如果選項是由應用程式設定, SO_DEBUG
則 Windows 套接字的某些實作會提供輸出偵錯資訊。
支援 SetSockOpt
下列選項。 Type 會識別 所 lpOptionValue
尋址的數據類型。
值 | 類型 | 意義 |
---|---|---|
SO_BROADCAST |
BOOL |
允許在套接字上傳輸廣播訊息。 |
SO_DEBUG |
BOOL |
記錄偵錯資訊。 |
SO_DONTLINGER |
BOOL |
請勿封鎖 Close 等候傳送未傳送的數據。 設定此選項相當於將 設定為零的 設定SO_LINGER l_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 實作偵測到網路子系統失敗。WSAEINVAL
nHow
無效。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
來設定套接字選項。