共用方式為


Windows Sockets:使用封存的通訊端範例

本文將使用類別的範例 CSocket。 這個範例會使用 CArchive 物件的通訊端序列化資料。 請注意這不是文件序列化至檔案。

下列範例說明如何使用封存透過 CSocket 物件所傳送和接收資料。 範例設計,讓應用程式 (在相同的電腦上或在網路上的不同電腦) 交換資料的兩個執行個體。 執行個體傳送資料,另一個執行個體中的通知。 任一應用程式可以啟始切換,因此將可當做伺服器或用戶端到另一個應用程式。 下列函式在應用程式的檢視類別定義:

void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
   BYTE bValue = 0;
   WORD nCopies = 0;

    if (arData.IsStoring())
    {
        CString strText;
        errno_t err;
        unsigned int number;

        for(int p = 0; p < nPackets; p++)
        {
            err = rand_s(&number);
            // if (err == 0)...
            bValue = (BYTE)(number%256);

            err = rand_s(&number);
            // if (err == 0)...
            nCopies = (WORD)(number%32000);

            // Send header information
            arData << bValue << nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Send data
                arData << bValue;
            }

            strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
            p + 1, nPackets, (int)bValue, nCopies);

            // Send receipt string
            arData << strText;
            arData.Flush();

            // Receive acknowledgment
            arAck >> strText;
            // display it
            DisplayMessage(strText);
        }
    }
    else
    {
        CString strText;
        BYTE bCheck;

        for(int p = 0; p < nPackets; p++)
        {
            // Receive header information
            arData >> bCheck >> nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Receive data
                arData >> bValue;
                if (bCheck != bValue)
            {
               AfxMessageBox(_T("Packet Failure"));
            }
         }

         // Receive receipt string and display it
         arData >> strText;
         DisplayMessage(strText);

         strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"), 
            p + 1, nPackets, (int)bValue, nCopies);

         // Send acknowledgment
         arAck << strText;
         arAck.Flush();
      }
    }
}

如需這個範例的最重要的事是 MFC Serialize 函式其結構平行。 PacketSerialize 成員函式包括與 else 子句的 if 陳述式。 函式會接收兩個 CArchive 參考做為參數: arData 和 arAck。 如果 arData 封存物件為儲存 (傳送) 設定, if 分支執行;否則,則為,如果 arData 為載入 (接收) 設定函式採用 else 分支。 如需如何以 MFC 撰寫序列化的詳細資訊,請參閱序列化

注意事項注意事項

arAck 封存物件假設 arData是相反。如果 arData 是要傳送 arAck 接收,計數器為 true。

對於傳送,範例函式為迴圈時,都會產生一些隨機資料的指定次數為了便於示範。 您的應用程式將衍生自某個來源的實際資料,例如檔案。 arData 表示檔案的插入運算子 (<<) 用於傳送資料的連續區塊資料流:

  • 指定資料的性質的標題 (在此例中, bValue 變數的值,以及可供傳送)。

    兩個項目對於這個範例會隨機產生。

  • 指定之資料的複本數目。

    內部 for 重複傳送 bValue 指定的次數。

  • 字串呼叫接收者顯示給使用者的 strText 。

對於接收函式,功能差不多,但是從封存中使用捲軸的檔案擷取運算子 (>>) 取得資料。 接收應用程式驗證資料,最後顯示「接收訊息」,然後傳回稱為「傳送」的傳回顯示訊息。

在這個中通訊模型, 「接收」的文字,在 strText 變數所傳送的訊息,是顯示在通訊的另一端,因此,指定給接收使用者的一些資料包接收。 接收者回覆與稱為「傳送」的相同的字串,在原始寄件者的螢幕顯示的。 開啟收款兩個字串表示成功的通訊時發生。

警告

如果您正在撰寫一個 MFC 用戶端程式建立的 (非 MFC) 伺服器通訊,請勿將封存傳送 C++ 物件。除非伺服器是了解這種物件的 MFC 應用程式要傳送,無法接收和序列化您的物件。一個範例會在 Windows Sockets:位元組順序 一文顯示型別的通訊。

如需詳細資訊,請參閱 Windows Sockets 規格: htonlntohlntohlntohs。 如需詳細資訊,請參閱:

請參閱

參考

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

概念

MFC 中的 Windows Sockets