Windows 通訊端: 通訊端的保存檔的運作方式
這篇文章說明如何 CSocket 物件, CSocketFile 物件,以及 CArchive 物件會結合以簡化傳送及接收資料,透過 Windows 通訊端。
發行項 Windows 通訊端: 通訊端使用封存的範例 會顯示 PacketSerialize 函式。 保存物件在 PacketSerialize 範例這種方式很像保存物件傳遞至 MFC Serialize 函式。 基本的差異是通訊端,附加保存檔是不是以一種標準 CFile (一般與相關聯的磁碟檔案) 的物件,但CSocketFile物件。 而不是連線到磁碟檔案、 CSocketFile物件會連接到CSocket物件。
A CArchive物件管理緩衝區。 當儲存 (傳送) 的保存的緩衝區已滿時,有相關聯CFile物件寫出緩衝區的內容。 正在排清附加到通訊端之封存的暫存等於傳送訊息。 當載入 (接收) 封存的緩衝區已滿, CFile物件會停止讀取直到緩衝區時,即可使用。
類別CSocketFile是衍生自CFile,但這並不支援 CFile 成員函式,例如定位的函式 (Seek, GetLength, SetLength,依此類推)、 鎖定函式 (LockRange, UnlockRange),或GetPosition函式。 所有 CSocketFile 物件必須執行會寫入或讀取與相關聯的位元組序列的CSocket物件。 因為未牽涉到的檔案作業,例如Seek和GetPosition沒有什麼意義。 CSocketFile衍生自CFile,所以它通常會繼承所有的這些成員函式。 若要避免如此,不支援CFile中的成員函式會覆寫CSocketFile擲回 CNotSupportedException。
CSocketFile物件呼叫的函式成員其CSocket傳送或接收資料的物件。
下圖顯示這些物件之間的關係,雙方的通訊。
CArchive、 CSocketFile,以及 CSocket
這個明顯複雜性的目的是免除您管理自己的通訊端的詳細資料的必要性。 建立通訊端和檔案封存,並插入到保存檔,或從封存中擷取,然後開始傳送或接收資料。 CArchive, CSocketFile,以及 CSocket 管理幕後作業的詳細資料。
A CSocket物件是一個兩個狀態物件: 有時候非同步 (一般狀態),有時同步。 以非同步的狀態,將通訊端可以接受來自架構的非同步通知。 不過,如接收或傳送資料作業期間成為同步通訊端。 這表示通訊端將會收到非同步告知,直到同步作業已經完成。 因為它切換模式時,你,比方說,有辦法對付如下所示:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
如果CSocket不是實作為兩個狀態物件,可能會接收相同的事件的其他告知,當您在處理先前的告知。 比方說,您可能會得到OnReceive通知,同時處理OnReceive。 在上述的程式碼片段,解壓縮str從保存可能會導致無法遞迴。 藉由切換狀態, CSocket防止遞迴禁止其他通知。 一般規則是告知內沒有告知。
注意事項 |
---|
A CSocketFile也會做為 (有限) 的檔案,而不CArchive物件。根據預設, CSocketFile建構函式的bArchiveCompatible參數是 ,則為 TRUE。這會指定檔案物件是與封存一起使用。若要使用沒有封存檔的檔案物件,傳入 ,則為 FALSE 在bArchiveCompatible參數。 |
在其 「 封存相容"模式下, CSocketFile物件提供較佳的效能,並降低的 「 死結 」。傳送與接收通訊端會等候彼此,或等候常見的資源時,就會發生死結。 如果發生這種情況,可能會CArchive物件使用過CSocketFile一樣具有CFile物件。 與CFile,封存可以假設如果它接收的位元組會比要求較少,具有已到達檔案結尾。 與CSocketFile,不過,資料是訊息為基礎。 緩衝區中所包含多個訊息,以便接收要求的位元組數小於並不代表檔案結尾。 應用程式不會封鎖在這個案例中可能與CFile,而且可以繼續從緩衝區讀取的郵件,直到緩衝區是空的。 IsBufferEmpty 在CArchive適合用來監視封存的緩衝區,在這種情況下的狀態。
如需詳細資訊,請參閱 Windows 通訊端: 使用通訊端,以保存檔