国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Windows Sockets:帶存檔的套接字的工作方式

2019-11-17 05:07:23
字體:
來源:轉載
供稿:網(wǎng)友
本文解釋如何組合 CSocket 對象、CSocketFile 對象和 CArchive 對象以簡化通過 Windows 套接字發(fā)送和接收數(shù)據(jù)。
文章 Windows Sockets:帶存檔的套接字示例介紹了 PacketSerialize 函數(shù)。 PacketSerialize 示例中的存檔對象的工作機制與傳遞給 MFC Serialize 函數(shù)的存檔對象非常相似。它們之間的基本差異是:對于套接字,存檔并不附加到標準的 CFile 對象(通常與磁盤文件關聯(lián)),而是附加到 CSocketFile 對象。 CSocketFile 對象不是連接到磁盤文件,而是連接到 CSocket 對象。 一個 CArchive 對象治理一個緩沖區(qū)。當存儲(發(fā)送)存檔的緩沖區(qū)已滿時,關聯(lián)的 CFile 對象寫出緩沖區(qū)的內(nèi)容。刷新附加到套接字的存檔緩沖區(qū)相當于發(fā)送消息。當加載(接收)存檔的緩沖區(qū)已滿時, CFile 對象停止讀取直到該緩沖區(qū)再次可用。 CSocketFile 類從 CFile 派生,但它并不支持 CFile 成員函數(shù),如定位函數(shù) Seek 、 GetLength 、 SetLength 等,鎖定函數(shù) LockRange 和 UnlockRange ,或 GetPosition 函數(shù)。每個 CSocketFile 對象必須要做的事是,將字節(jié)序列寫入或讀入關聯(lián)的 CSocket 對象,或從此對象寫出或讀出字節(jié)序列。因為不涉及文件, Seek 和 GetPosition 等操作沒有意義。 CSocketFile 從 CFile 派生,因此它通常會繼續(xù)所有這些成員函數(shù)。為防止發(fā)生這種情況,在 CSocketFile 中重寫不受支持的 CFile 成員函數(shù)以引發(fā) CNotSupportedException。 CSocketFile 對象調(diào)用其 CSocket 對象的成員函數(shù)來發(fā)送或接收數(shù)據(jù)。 下圖顯示了在通信的兩端這些對象之間的關系。 CArchive、CSocketFile 和 CSocket
這看起來很復雜,其目的是使您不必親自治理套接字的細節(jié)。您創(chuàng)建套接字、文件和存檔,然后通過將數(shù)據(jù)插入存檔或從存檔提取數(shù)據(jù),開始發(fā)送或接收數(shù)據(jù)。CArchive、CSocketFile 和 CSocket 治理后臺的細節(jié)。 CSocket 對象實際是一個兩狀態(tài)對象:有時異步(通常狀態(tài))有時同步。處于異步狀態(tài)時,套接字可以從框架接收異步通知。然而,在操作(如接收或發(fā)送數(shù)據(jù))過程中,套接字變?yōu)橥降摹_@意味著在同步操作完成之前,套接字不會接收進一步的異步通知。由于套接字切換模式,請執(zhí)行類似下面的操作: CMySocket::OnReceive( ){ // ... ar > > str; // ...} 假如 CSocket 沒有實現(xiàn)為兩狀態(tài)對象,則在您處理前面通知的同時,有可能接收到同類事件的附加通知。例如,在處理 OnReceive 時,可能收到 OnReceive 通知。在上面的代碼片段中,從存檔提取 str 可能導致遞歸。通過切換狀態(tài), CSocket 用防止附加通知的方法防止遞歸。一般規(guī)則是通知內(nèi)沒有通知。 CHATTER 和 CHATSRVR 示例應用程序闡釋了這種用法。有關 MFC 示例的源代碼和信息,請參見 MFC 示例。
注重 CSocketFile 也可以作為一個沒有 CArchive 對象的(有限)文件使用。默認情況下, CSocketFile 構造函數(shù)的 bArchiveCompatible 參數(shù)為 TRUE 。這指定文件對象用于存檔。若要使用沒有存檔的文件對象,請在 bArchiveCompatible 參數(shù)中傳遞 FALSE 。

在“存檔兼容”模式下, CSocketFile 對象可提供更好的性能并能減少“死鎖”的危險。當發(fā)送套接字和接收套接字都在等待對方或等待公共資源時,就會發(fā)生死鎖現(xiàn)象。假如 CArchive 對象用處理 CFile 對象的方式處理 CSocketFile ,也可能發(fā)生這種情況。處理 CFile 時,存檔可假定只要它接收到的字節(jié)數(shù)比所請求的少,則說明已到達文件尾。而處理 CSocketFile 時,數(shù)據(jù)是基于消息的,緩沖區(qū)可包含多條消息,因此,接收的字節(jié)數(shù)比請求的字節(jié)數(shù)少并不能說明已到達文件尾。應用程序在此情況下并不阻塞(而使用 CFile 時可能阻塞),它可繼續(xù)從緩沖區(qū)讀取消息直到緩沖區(qū)變空。在這種情況下, CArchive 中的 IsBufferEmpty 函數(shù)有助于監(jiān)視存檔緩沖區(qū)的狀態(tài)。 有關更多信息,請參見 Windows Sockets:使用帶存檔的套接字。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江都市| 永靖县| 交口县| 平南县| 内江市| 保定市| 中江县| 古蔺县| 土默特左旗| 井研县| 南岸区| 达孜县| 广东省| 宁都县| 河东区| 台中县| 塔城市| 阳西县| 兴城市| 大理市| 南京市| 绥江县| 大同市| 深圳市| 武平县| 松滋市| 澄城县| 南部县| 鹤壁市| 沂南县| 玛曲县| 乌鲁木齐县| 张家界市| 南昌市| 张家港市| 孟村| 敦化市| 卫辉市| 卫辉市| 普洱| 根河市|