[英]C++ IPC Communication
我在以下情況下無法做出決定。 請需要專家的幫助。
方案:在兩個框中運行的兩個進程之間存在TCP / IP通信。
通信方法1:在套接字上基於流的通信。 在接收方的哪里,他將接收整個字節緩沖區,並將前幾個固定字節解釋為標頭,然后對其進行反序列化,從而了解消息長度,並開始獲取該長度的消息並反序列化,然后繼續進行下一個消息標頭,如下所示:上....
通訊方式2:將所有消息放入向量中,向量將駐留在類對象中。 一次性將類對象序列化並發送給接收者。 接收器反序列化類對象,並一一讀取向量數組。
請讓我知道哪種方法有效,如果有其他方法,請指導我。
基於類的數據傳輸和基於結構的數據傳輸的優缺點,以及哪種情況適合?
您的問題缺少一些關鍵細節,並且混雜了不同的關注點,使您無法提供一個很好的答案。
具體來說,方法2神秘地“序列化”和“反序列化”對象和包含的向量,而沒有指定如何完成操作的任何細節。 實際上,細節是方法1中提到的那種。因此,除非您在使用序列化庫和從頭做起之間進行選擇(在這種情況下,我會說使用庫),否則1和2並不是替代方案。因為您是新手,而圖書館更可能會正確解決此問題)。
我可以說:
read()
或recv()
從套接字讀取盡可能多的數據
因此,讓我強調一下:不要假設您從套接字的任何給定讀取中接收到的字節數都不會超過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.