發(fā)布日期: 2016年7月
若要了解有關(guān) Visual Studio 2017 RC 的最新文檔,請參閱 Visual Studio 2017 RC 文檔。
從 CAsyncSocket
比派生,繼承其 Windows 套接字 API 的封裝,表示較高級別的抽象 CAsyncSocket
對象。
class CSocket : public CAsyncSocket
名稱 | 描述 |
---|---|
CSocket::CSocket | 構(gòu)造 CSocket 對象。 |
名稱 | 描述 |
---|---|
CSocket::Attach | 附加 SOCKET 句柄 CSocket 對象。 |
CSocket::CancelBlockingCall | 移除當(dāng)前正在進行阻止的調(diào)用。 |
CSocket::Create | 創(chuàng)建一個套接字。 |
CSocket::FromHandle | 返回指向 CSocket 對象命名 SOCKET 處理。 |
CSocket::IsBlocking | 確定塊是否調(diào)用正在進行。 |
名稱 | 描述 |
---|---|
CSocket::OnMessagePending | 調(diào)用過程等待消息,當(dāng)?shù)却龎K調(diào)用時完成。 |
CSocket
與選件類 CSocketFile
和 CArchive
使用管理發(fā)送和接收數(shù)據(jù)。
CSocket
對象還提供塊,對 CArchive
的同步操作非常重要。 塊函數(shù),例如 Receive
,Send
,ReceiveFrom
,SendTo
,并且,Accept
(所有繼承 CAsyncSocket
),則不會返回在 CSocket
的一個 WSAEWOULDBLOCK
錯誤。 相反,這些函數(shù)等待,直到操作完成。 此外,原始的調(diào)用將停止與該錯誤 WSAEINTR
,如果 CancelBlockingCall
調(diào)用,當(dāng)其中一種功能塊時。
若要使用 CSocket
對象,請調(diào)用構(gòu)造函數(shù),然后調(diào)用 Create
創(chuàng)建基礎(chǔ) SOCKET
句柄 (類型 SOCKET
)。 Create
的默認參數(shù)創(chuàng)建流,套接字,但,則使用具有 CArchive
對象的套接字,可以指定參數(shù)創(chuàng)建數(shù)據(jù)進行套接字,或者綁定到特定端口創(chuàng)建服務(wù)器套接字。 在客戶端上使用服務(wù)器端,的 Connect
和 Accept
連接到客戶端套接字。 然后創(chuàng)建一 CSocketFile
對象并將它設(shè)置為 CSocketFile
構(gòu)造函數(shù)的 CSocket
對象。 接下來,創(chuàng)建發(fā)送的一 CArchive
對象和一個收到的數(shù)據(jù) (根據(jù)需要),然后將它們與 CArchive
構(gòu)造函數(shù)的 CSocketFile
對象。 當(dāng)通信完成時,銷毀CArchive
、CSocketFile
和 CSocket
對象。 SOCKET
數(shù)據(jù)類型在文章 Windows 套接字:背景所述。
當(dāng)您使用 CArchive
和 CSocketFile
和 CSocket
時,可能會遇到 CSocket::Receive
輸入循環(huán)的情況 ( PumpMessages(FD_READ)
) 等待請求的少量字節(jié)。 這是因為,Windows 套接字只允許一 recv 每個 FD_READ 通知調(diào)用,但是,CSocketFile
和 CSocket
允許多個 recv 每 FD_READ 調(diào)用。 如果收到 FD_READ,而沒有讀取數(shù)據(jù),應(yīng)用程序停止。 如果不會收到另一個 FD_READ,應(yīng)用程序停止間通信套接字。
通過以下方式可以解決此問題。 在您的套接字選件類 OnReceive
方法,請調(diào)用 CAsyncSocket::IOCtl(FIONREAD, ...)
,在調(diào)用您的郵件類之前Serialize
方法,當(dāng)從套接字要讀取的所需的數(shù)據(jù)超過一 TCP 數(shù)據(jù)包時 (中等的網(wǎng)絡(luò),通常至少 1096 個字節(jié)的最大傳輸單位的范圍)。 如果可用數(shù)據(jù)的大小程度低于必要,等待所有數(shù)據(jù)接收和此時開始這次讀取操作。
在下面的示例中,m_dwExpected
是用戶所需接收的近似字節(jié)數(shù)。 假定,可以在代碼中的其他位置聲明它。
void CChatSocket::OnReceive(int nErrorCode){ CSocket::OnReceive(nErrorCode); DWORD dwReceived; if (IOCtl(FIONREAD, &dwReceived)) { if (dwReceived >= m_dwExpected) // Process only if you have enough data m_pDoc->ProcessPendingRead(); } else { // Error handling here }}
![]() |
---|
在使用 MFC 套接字在靜態(tài)鏈接的 MFC 應(yīng)用程序時的輔助線程,則必須對使用套接字初始化套接字庫的每個線程的 |
有關(guān)更多信息,請參見 在 MFC 的 Windows 套接字,Windows 套接字:使用套接字與存檔,Windows 套接字:套接字具有如何的存檔工作,Windows 套接字:操作的順序,Windows 套接字:套接字的示例使用中的存檔。
CSocket
標頭: afxsock.h
CAsyncSocket Class
層次結(jié)構(gòu)圖
CAsyncSocket Class
CSocketFile Class