| 導購 | 订阅 | 在线投稿
分享
 
 
 

Windows Sockets:帶存檔的套接字示例

來源:互聯網  2008-06-01 01:57:50  評論

本文給出一個使用 CSocket 類的示例。該示例使用 CArchive 對象通過套接字來序列化數據。注重,這並不是來自某個文件或到某個文件的文檔序列化。

下面的示例闡釋了使用存檔通過 CSocket 對象發送和接收數據的方式。該示例設計爲應用程序的兩個實例(在同一台計算機上或在網絡上的不同計算機上)交換數據。一個實例發送數據,另一個實例接收並確認數據。每個應用程序都可以啓動交換,也可作爲另一個應用程序的服務器或客戶端。下面的函數在應用程序的視圖類中定義: void CBlabberView::PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck) { if (arData.IsStoring()) { CString strText; for(int p = 0; p < nPackets; p++) { BYTE bValue = (BYTE)(rand()%256); Word nCopies = (WORD)(rand()%32000); // Send header information arData < < bValue < < nCopies; for(int c = 0; c < nCopies; c++) { // Send data arData < < bValue; } Text.Format("Received Packet %d of %d (Value=%d,Copies=%d)",p,nPackets,(int)bValue,nCopies); // Send receipt string arData < < strText; arData.Flush(); // Receive acknowledgment arAck >>strText; // display it DisplayMessage(strText); } } else { CString strText; BYTE bCheck; WORD nCopies; 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 (nCheck != bValue) AfxMessageBox("Packet Failure"); } } // Receive receipt string and display it arData >>strText; DisplayMessage(strText); Text.Format("Sent Packet %d of %d (Value=%d,Copies=%d)",p,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 用于接收,反過來也一樣。

對于發送,該示例函數按指定的次數循環,而每一次都生成一些隨機數據用于演示目的。應用程序從某個源(如文件)中獲取真實數據。 arData 存檔的插入運算符 ( < < ) 用于發送由三個連續數據塊組成的流:

指定數據性質的「頭」(這裏是指 bValue 變量的值和將發送的份數)。

此示例中兩項都是隨機生成。

指定的數據份數。

內部 for 循環按指定的次數發送 bValue 。

接收端顯示給用戶的稱爲 strText 的字符串。

在接收方面,函數的操作相似,不同的是它使用存檔的提取運算符 ( >>) 從存檔中獲取數據。接收應用程序驗證收到的數據,顯示最終的「已收到」(Received) 消息,然後發回一條消息,指明「已發送」(Sent) 以供發送應用程序顯示。

在此通信模型中,「已收到」(Received) 一詞( strText 變量中發送的消息)用于在通信的另一端顯示,是向接收用戶指明已經接收到一定數量的數據包。接收端用一個指明「已發送」(Sent) 的相似字符串答複,而此字符串將在原始發送端的屏幕上顯示。這兩個字符串的回執說明通信已成功。

警告 假如正編寫與已建立的(非 MFC)服務器進行通信的 MFC 客戶程序,則不要通過存檔發送 C++ 對象。除非該服務器是一個 MFC 應用程序,它知道您要發送的對象的類型,否則服務器將無法接收和反序列化該對象。文章 Windows Sockets:字節排序中的示例顯示了一個此類型的通信。

Windows Sockets:帶存檔的套接字示例
更多內容請看Windows操作系統安全集 Windows操作系統安裝 Windows頻道專題,或

本文給出一個使用 CSocket 類的示例。該示例使用 CArchive 對象通過套接字來序列化數據。注重,這並不是來自某個文件或到某個文件的文檔序列化。 下面的示例闡釋了使用存檔通過 CSocket 對象發送和接收數據的方式。該示例設計爲應用程序的兩個實例(在同一台計算機上或在網絡上的不同計算機上)交換數據。一個實例發送數據,另一個實例接收並確認數據。每個應用程序都可以啓動交換,也可作爲另一個應用程序的服務器或客戶端。下面的函數在應用程序的視圖類中定義: void CBlabberView::PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck) { if (arData.IsStoring()) { CString strText; for(int p = 0; p < nPackets; p++) { BYTE bValue = (BYTE)(rand()%256); Word nCopies = (WORD)(rand()%32000); // Send header information arData < < bValue < < nCopies; for(int c = 0; c < nCopies; c++) { // Send data arData < < bValue; } Text.Format("Received Packet %d of %d (Value=%d,Copies=%d)",p,nPackets,(int)bValue,nCopies); // Send receipt string arData < < strText; arData.Flush(); // Receive acknowledgment arAck >>strText; // display it DisplayMessage(strText); } } else { CString strText; BYTE bCheck; WORD nCopies; 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 (nCheck != bValue) AfxMessageBox("Packet Failure"); } } // Receive receipt string and display it arData >>strText; DisplayMessage(strText); Text.Format("Sent Packet %d of %d (Value=%d,Copies=%d)",p,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 用于接收,反過來也一樣。 對于發送,該示例函數按指定的次數循環,而每一次都生成一些隨機數據用于演示目的。應用程序從某個源(如文件)中獲取真實數據。 arData 存檔的插入運算符 ( < < ) 用于發送由三個連續數據塊組成的流: 指定數據性質的「頭」(這裏是指 bValue 變量的值和將發送的份數)。 此示例中兩項都是隨機生成。 指定的數據份數。 內部 for 循環按指定的次數發送 bValue 。 接收端顯示給用戶的稱爲 strText 的字符串。 在接收方面,函數的操作相似,不同的是它使用存檔的提取運算符 ( >>) 從存檔中獲取數據。接收應用程序驗證收到的數據,顯示最終的「已收到」(Received) 消息,然後發回一條消息,指明「已發送」(Sent) 以供發送應用程序顯示。 在此通信模型中,「已收到」(Received) 一詞( strText 變量中發送的消息)用于在通信的另一端顯示,是向接收用戶指明已經接收到一定數量的數據包。接收端用一個指明「已發送」(Sent) 的相似字符串答複,而此字符串將在原始發送端的屏幕上顯示。這兩個字符串的回執說明通信已成功。 警告 假如正編寫與已建立的(非 MFC)服務器進行通信的 MFC 客戶程序,則不要通過存檔發送 C++ 對象。除非該服務器是一個 MFC 應用程序,它知道您要發送的對象的類型,否則服務器將無法接收和反序列化該對象。文章 Windows Sockets:字節排序中的示例顯示了一個此類型的通信。 [url=/bbs/detail_1785090.html][img]http://image.wangchao.net.cn/it/1323424742300.gif[/img][/url] 更多內容請看Windows操作系統安全集 Windows操作系統安裝 Windows頻道專題,或
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有