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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
MSG_DONTROUTE
指定資料不應受限於路由。 Windows Sockets 供應商可以選擇忽略此旗標。MSG_OOB
傳送頻外資料(SOCK_STREAM
僅限)。
lpSockAddr
結構指標 SOCKADDR
,其中包含目標通訊端的位址。
nSockAddrLen
以位元組為單位 lpSockAddr
的位址長度。
傳回值
如果沒有發生錯誤, SendTo
則傳回傳送的字元總數。 (請注意,這可以小於 所 nBufLen
指出的數位。否則,會傳回 的值 SOCKET_ERROR
,而且可以呼叫 GetLastError
來擷取特定的錯誤碼。 下列錯誤適用于此成員函式:
WSANOTINITIALISED
使用這個 API 之前,必須先成功AfxSocketInit
發生。WSAENETDOWN
Windows Sockets 實作偵測到網路子系統失敗。WSAEACCES
要求的位址是廣播位址,但未設定適當的旗標。WSAEINPROGRESS
封鎖的 Windows 通訊端作業正在進行中。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
參數。 後者的建構方式是結合下列任何值與 C++ 位 OR 運算子 ( |
):
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
來設定通訊端選項。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應