共用方式為


CSocketFile 類別

CFile 物件,用於透過 Windows Sockets 在網路上傳送和接收資料。

語法

class CSocketFile : public CFile

成員

公用建構函式

名稱 描述
CSocketFile::CSocketFile 建構 CSocketFile 物件。

備註

您可以針對此目的將 CSocketFile 物件附加至 CSocket 物件。 您也可以使用 MFC 串行化,將 物件附加 CSocketFileCArchive 物件,以簡化傳送和接收數據。

若要串行化 (send) 數據,您可以將它插入封存中,以呼叫 CSocketFile 成員函式將數據寫入 CSocket 物件。 若要還原串行化 (receive) 數據,請從封存擷取。 這會導致封存呼叫 CSocketFile 成員函式從 CSocket 物件讀取數據。

提示

除了使用 CSocketFile 這裡所述,您也可以使用它做為獨立檔案物件,就像您可以使用 CFile的 基類一樣。 您也可以搭配任何封存型 MFC 串行化函式使用 CSocketFile 。 由於 CSocketFile 不支援所有 CFile的功能,因此某些預設 MFC 串行化函式與 不相容 CSocketFile。 這特別適用於 CEditView 類別。 您不應該嘗試透過附加至 物件的物件來串行化CEditView資料;請改用 CEditView::Serialize CEditView::SerializeRawCSocketFile CArchiveSerializeRaw式預期檔案物件具有沒有的函式,例如 SeekCSocketFile

當您搭配 和 使用 CArchive 時,可能會遇到進入迴圈(byPumpMessages(FD_READ))等候要求位元組量的情況CSocket::ReceiveCSocketCSocketFile 這是因為 Windows 套接字每個FD_READ通知只允許一個 recv 呼叫,但CSocketFileCSocket允許每個FD_READ多個 recv 呼叫。 如果您在沒有數據可讀取時收到FD_READ,應用程式會停止回應。 如果您從未收到另一個FD_READ,應用程式會停止透過套接字進行通訊。

您可以依照下列方式解決此問題。 在套接字類別的 方法中 OnReceiveCAsyncSocket::IOCtl(FIONREAD, ...) 當您從套接字讀取預期的數據超過一個 TCP 封包的大小時,請先呼叫 Serialize 訊息類別的方法(網路媒體的最大傳輸單位,通常是至少 1096 個字節)。 如果可用數據的大小小於需求,請等候接收所有數據,然後才開始讀取作業。

在下列範例中, m_dwExpected 是用戶預期要接收的大約位元組數目。 假設您在程式代碼的其他地方宣告它。

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 中的 Windows 套接字、 Windows 套接字:搭配封存使用套接字,以及 Windows Sockets 2 API

繼承階層架構

CObject

CFile

CSocketFile

需求

標頭: afxsock.h

CSocketFile::CSocketFile

建構 CSocketFile 物件。

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

參數

pSocket
要附加至 CSocketFile 物件的套接字。

bArchiveCompatible
指定檔案物件是否要與物件搭配 CArchive 使用。 只有在您想要以獨立方式使用 物件時,才傳遞 CSocketFile FALSE,就像是獨立 CFile 對象一樣,但有某些限制。 此旗標會變更 CArchive 附加至 CSocketFile 對象的物件如何管理其緩衝區以供讀取。

備註

當物件超出範圍或刪除時,物件的解構函式會解除與套接字物件本身的關聯。

注意

CSocketFile也可以當做沒有 CArchive 物件的 (有限) 檔案使用。 根據預設,建 CSocketFile 構函式的 bArchiveCompatible 參數為 TRUE。 這會指定檔案對象用於封存。 若要使用不含封存的 檔案物件,請在 bArchiveCompatible 參數中傳遞 FALSE。

在其「封存相容」模式中, CSocketFile 物件可提供更佳的效能,並減少「死結」的危險。當傳送和接收套接字彼此等候或通用資源時,就會發生死結。 如果 CArchive 對象處理 CSocketFile 物件的方式與 CFile 物件搭配使用,就可能發生這種情況。 使用 CFile時,封存可以假設,如果收到比所要求的位元組少,則已到達檔尾。

不過,使用 CSocketFile時,數據是以訊息為基礎;緩衝區可以包含多個訊息,因此接收的位元組數目少於要求的位元組數目,並不表示檔案結尾。 在此情況下,應用程式不會封鎖,因為它可能使用 CFile,而且它可以繼續從緩衝區讀取訊息,直到緩衝區是空的。 CArchive::IsBufferEmpty 函式有助於監視這類情況下封存緩衝區的狀態。

如需使用 CSocketFile的詳細資訊,請參閱 Windows 套接字:使用套接字與封存和 Windows 套接字:使用封存的套接字範例。

另請參閱

CFile 類別
階層架構圖表
CAsyncSocket 類別
CSocket 類別