通訊端使用保存檔的 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 通訊端規格: htonl, htons, ntohl, ntohs。 此外,如需詳細資訊,請參閱: