簡體   English   中英

C ++ IPC通訊

[英]C++ IPC Communication

我在以下情況下無法做出決定。 請需要專家的幫助。

方案:在兩個框中運行的兩個進程之間存在TCP / IP通信。

通信方法1:在套接字上基於流的通信。 在接收方的哪里,他將接收整個字節緩沖區,並將前幾個固定字節解釋為標頭,然后對其進行反序列化,從而了解消息長度,並開始獲取該長度的消息並反序列化,然后繼續進行下一個消息標頭,如下所示:上....

通訊方式2:將所有消息放入向量中,向量將駐留在類對象中。 一次性將類對象序列化並發送給接收者。 接收器反序列化類對象,並一一讀取向量數組。

請讓我知道哪種方法有效,如果有其他方法,請指導我。

基於類的數​​據傳輸和基於結構的數據傳輸的優缺點,以及哪種情況適合?

您的問題缺少一些關鍵細節,並且混雜了不同的關注點,使您無法提供一個很好的答案。

具體來說,方法2神秘地“序列化”和“反序列化”對象和包含的向量,而沒有指定如何完成操作的任何細節。 實際上,細節是方法1中提到的那種。因此,除非您在使用序列化庫和從頭做起之間進行選擇(在這種情況下,我會說使用庫),否則1和2並不是替代方案。因為您是新手,而圖書館更可能會正確解決此問題)。

我可以說:

  • 在TCP級別,讀取一個體面大小的塊是最有效的(假設我傾向於在PC /服務器硬件上工作,我只使用64k,盡管較小的塊可能足以獲得相同的吞吐量),並且每次read()recv()從套接字讀取盡可能多的數據
    • 在讀取了足夠的字節(以許多讀取/接收次數為單位)以嘗試對數據進行某種解釋之后,有必要認識到序列化輸入的特定部分的結尾:有時在所涉及的數據類型中是隱式的,有時它是使用某些前哨進行通信的(例如換行或NUL),有時可能會有一個固定大小的前綴“ expect N bytes”標頭。 此方面/考慮因素通常分層應用於對象流和嵌套的子對象等。
    • TCP讀/接收可能傳遞的數據比任何單個請求中發送的數據都要多,因此,在上面匯編的塊的末尾,您可能具有一個或多個字節,這些字節在邏輯上屬於后續但不完整的邏輯消息的一部分
    • C ++ iostream已支持讀取較大的塊然后訪問緩沖區中各種固定和可變大小的元素的過程,但是如果需要,可以自行滾動

因此,讓我強調一下:不要假設您從套接字的任何給定讀取中接收到的字節數都不會超過1個字節:如果您說20字節的標頭,則應該循環讀取,直到遇到錯誤或匯編所有20個字節為止。 在單個write()send()中發送20個字節並不意味着將20個字節呈現給單個read() / recv() TCP是字節流協議,在提供字節數時,您必須獲取任意數量的字節,直到有足夠的數據來解釋它為止。 同樣,准備獲得比客戶端在單個write() /`send()中寫入的數據更多的數據。

基於類的數​​據傳輸和基於結構的數據傳輸的優缺點,以及哪種情況適合?

這些術語完全是偽造的。 類和結構在C ++中幾乎是相同的-分組數據和相關函數的機制(它們的區別僅在於它們-默認情況下-將基類和數據成員暴露給客戶端代碼的方式)。 可以具有成員函數或支持代碼,以幫助序列化和反序列化數據。 例如,最簡單和最典型的支持是operator<<和/或operator>>流功能。

如果您想通過專門的“編寫二進制塊,讀取二進制塊”的方法(例如,將結構視為沒有支持代碼的POD)來對比這些流函數,那么我想說一下流函數從流式傳輸到人類可讀的表示形式開始,這將使您的系統更容易,更快捷地進行開發,調試和支持。 一旦您真正滿意了,如果運行時性能需要它,則可以使用二進制表示形式進行優化。 如果您很好地編寫了序列化代碼,您將不會注意到較粗的void*/#bytes數據模型與正確的按成員序列化之間的性能差異,但是后者可以更輕松地支持異常情況-跨不同系統的可移植性大小int / longs等,不同的字節順序,有意的選擇是淺層還是深層復制指向的數據等....

我還建議您查看boost序列化庫。 即使您不使用它,它也應該使您更好地了解如何在C ++中合理地實現這種事情。

兩種方法是等效的。 在兩者中,您都必須發送帶有消息大小和標識符的標頭,以便反序列化。 如果您認為第一個選項是由序列化的“類”組成的,就像普通消息一樣,則必須實現相同的“代碼”。

您必須牢記的另一件事是消息的大小,以便使用完整的TCP緩沖區來優化通信。 如果您的第一種方法消息太少,請嘗試使用較大的消息(如您​​描述的第二種方法)來提高通信比率。

請記住,這不是安全簡單地直接將其解釋為一個字節序列,即使它是一個簡單的POD流出來了一個結構或類-有沒有像排列順序問題(這是不太可能對我們大多數人的現實世界中的問題),以及結構對齊/填充(這一個潛在的問題)。

C ++沒有內置的序列化/反序列化功能,您必須自己動手或看一下boost序列化或Google的protobuf之類的東西

如果這不是一項家庭作業或學習項目,那么在TCP流級別上擺弄IPC可能毫無意義,特別是如果這不是人們所不熟悉的。

使用消息傳遞庫(例如ØMQ)發送和接收完整的消息,而不是字節流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM