共用方式為


CSocketFile 類別

提供傳送和接收網路上的資料使用的 CFile 物件透過 Windows Sockets。

class CSocketFile : public CFile

成員

1e4zc0sx.collapse_all(zh-tw,VS.110).gif公用建構函式

名稱

描述

CSocketFile::CSocketFile

建構 CSocketFile 物件。

備註

您可以 CSocket 附加至物件的 CSocketFile 物件。 使用 MFC 序列化,您也可以將一般,附加至 CArchive 物件的 CSocketFile 物件簡化傳送和接收資料。

若要序列化 () 傳送資料,您可以將該步驟順序插入檔案, CSocketFile 呼叫成員函式來 CSocket 物件寫入資料。 若要序列化 (sInk) 資料,您需要從這個檔案擷取物件。 這會讓此檔案稱為 CSocketFile 成員函式讀取 CSocket 物件的資料。

提示

除了使用之外 CSocketFile 如下所述,您可以使用它,獨立檔案物件,就可以使用 CFile,它的基底類別。您也可以使用任何檔案架構的 MFC 序列化函式的 CSocketFile 。由於 CSocketFile 不支援所有 CFile 的功能,某些預設序列化 MFC 函式和 CSocketFile相容。這特別適用的 CEditView 類別。您不應嘗試使用 CEditView::SerializeRaw附加至物件的 CSocketFileCArchive 物件序列化 CEditView 資料;使用 CEditView::SerializeSerializeRaw 函式要求檔案物件的函式,例如 SeekCSocketFile 沒有。

當您使用 CArchiveCSocketFileCSocket時,可能會遇到 CSocket::Receive 進入迴圈的條件 ( PumpMessages(FD_READ)) 等待要求的數量 (以位元組為單位)。 這是因為, Windows Sockets 只允許每 FD_READ 告知一個 recv 呼叫,不過, CSocketFileCSocket 允許每個 FD_READ 的多個 recv 呼叫。 如果您取得 FD_READ,當無法讀取資料時,應用程式無回應。 如果永遠不會被另一個 FD_READ,應用程式會透過通訊端。

您可以依照下列方式來解決此問題。 在您的通訊端類別 OnReceive 方法,呼叫 CAsyncSocket::IOCtl(FIONREAD, ...) ,才能呼叫您的訊息類別之前 Serialize 方法,當從通訊端 (Socket) 要讀取的預期的資料超過一個 TCP 封包 (Web 媒體,通常至少 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 SocketsWindows Sockets:使用具有檔案的通訊端,以及 Windows Sockets 2 API

繼承階層架構

CObject

C 檔案

CSocketFile

需求

Header: afxsock.h

請參閱

參考

C 檔案類別

階層架構圖

CAsyncSocket 類別

CSocket 類別