共用方式為


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::SerializeCEditView::SerializeRawCSocketFileCArchiveSerializeRaw 式預期檔案物件具有沒有 的函式,例如 SeekCSocketFile

當您搭配 和 使用 CArchive 時,可能會遇到進入迴圈(by PumpMessages(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 類別