通訊端使用保存檔的 Windows 通訊端: 範例

本文將介紹使用類別的範例 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 成員函式所組成如果 陳述式加上 其他子句。此函式會接收兩個 CArchive 做為參數的參考: arData和arAck。如果arData保存物件設定為儲存 (傳送), 如果分支執行 ; 否則,如果arData被設定來載入 (接收) 該函式其他分支。如需有關在 MFC 中序列化的詳細資訊,請參閱序列化

注意事項注意事項

arAck保存物件會被假設為相反的arData。如果arData是用於傳送, arAck收到時,及相反情況則為 true。

傳送,函式範例迴圈數次,每次產生一些隨機資料,供示範之用。您的應用程式會從某個來源,例如,檔案中取得實際資料。arData封存的插入運算子 (<<) 用來傳送資料流的資料的三個連續區塊:

  • 「 頁首 」,指定資料的本質 (在此情況下,值bValue變數,會傳送多少副本)。

    以本例而言,這兩個項目會隨機產生。

  • 指定的數字資料的副本。

    內部循環播放,會傳送bValue指定的次數。

  • 字串,稱為strText ,接收者會顯示給使用者。

接收,函式操作類似,不同之處在於,它會使用封存的引出運算子 (>>) 從封存取得資料。接收應用程式驗證它接收、 會顯示最後的 「 接收 」 訊息,並接著會傳回一則訊息,指出 「 寄件備份 」 資料,如傳送的應用程式,以顯示。

在這個通訊模型中,「 接收 」 這個字傳送訊息, strText並不變數,是在另外一個端點的通訊,因此它向接收使用者指定已接收的資料封包數目。收件者] 以訴說 「 傳送 」,以顯示原始寄件者的螢幕上的類似字串回覆。只要接收這兩個字串會指出發生成功通訊。

注意事項警告

如果您正在撰寫與已建立的 (非 MFC) 伺服器通訊的 MFC 用戶端程式,不要傳送經由封存的 C++ 物件。除非伺服程式是瞭解您想要傳送的物件類型的 MFC 應用程式,將無法接收,並將您的物件還原序列化。文件中的一個範例 Windows 通訊端: 位元組的順序示範這種類型的通訊。

如需詳細資訊,請參閱 Windows 通訊端規格: htonlhtonsntohlntohs。此外,如需詳細資訊,請參閱:

請參閱

參考

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

概念

在 MFC 中的 Windows 通訊端