xml有良好的開放性、可讀性和可擴充性。如果你的協議是開放的,並且希望別人也能幫你做些擴充功能的什麼外掛程式的,可以考慮用xml。但是最本質的一點,xml的有效載荷實在太低,封裝和解析效率太低,所以只適用於非常少量,對效能沒要求的網路流量。典型的案例就是文字聊天。如 gtalk 的基礎,開源的即時訊息協議系統 jabber。
另外,對於j**a和.net系統,由於內建xml引擎,採用xml有天然的優勢。而且反正這麼累贅了,也不在乎xml的流量再多耗費點。
但是對於c++, xml顯然就太累贅了。最重要的是,如果你的工程中本身沒有xml需求,那麼還需要額外的引入乙個xml引擎,無論是從速度、效率、可靠性、**複雜性來看,都非常的得不償失。
c++的網路處理,千變萬化,但離不了的乙個宗旨,就是:
c++形式的易讀易懂易訪問的結構形式 <=序列化=> 無型別的緩衝區資料。
c++的結構體按照需求隨便定義,緩衝區就是一段位元組資料,各種技巧大部分集中在序列化的操作上。一般的應用級別,在結構體前面加上 型別識別,長度確定就可以。而對效能和頻寬要求苛刻的應用,可能會將結構體拆解,並按照位類序列號,以最大限度的節約頻寬,典型的例子是diablo的封包。
對於一般的應用,序列化通常是 型別 | 長度 | 原始結構體
或者調換下 長度 | 型別 | 原始結構體
這種形式接單可靠而且足夠用,但是有幾個小技巧,可以提公升下效能和簡化下操作流程。
因為需要在原始結構體前面加入兩個資料,因此序列化時需要拷貝內容到緩衝區,拷貝操作本身會浪費些些的時鐘週期和記憶體,雖然不多,但是頻繁操作的話,也是種累贅。有兩種方式可以避免這種拷貝操作。
方法一: 將型別和長度定義到結構體裡面,如:
struct basemsg;
所有的結構均繼承自basemsg,就可以整個結構一次傳送了,傳送的流程也很簡單。
sendmsg(basemsg* pmsg)
方法二:利用集散io的功能。集散io可以同時傳送(接受)多個不同的部分。這樣子就不必拷貝了。如:
byte header[4];
byte* pmsg = 要傳送的結構體;
wsabuf buff[2];
buff[0] = header;
buff[1] = pmsg;
wsasend(buff, 2, ......)
出處:
網路資料傳輸
網路資料傳輸 wcdma全名是widebandcdma,中文譯名為 寬頻分碼多工訪問 它可支援384kbps到2mbps不等的資料傳輸速率,在高速移動的狀態,可提供384kbps的傳輸速率,在低速或是室內環境下,則可提供高達2mbps的傳輸速率。而gsm系統目前只能傳送9.6kbps,固定線路mod...
Qt 網路資料傳輸
以前寫介面主要用qt做ui,底層的功能是呼叫別人提供的介面,分工比較明確,但要更好地實現跨平台,則盡量使用qt內部的介面 當然,也有很多比較強大的庫,例如libcurl qt5自帶的網路處理模組qtnetwork 主要通過qnetworkaccessmanager qnetworkrequest q...
網路程式設計 UDP 資料傳輸
網路程式設計 udp協議 傳送端 udp與tcp的區別 udp為無連線,不安全,速度快 tcp為連線,安全,速度稍慢 public class udpsend byte bt line.getbytes 建立資料報 datagrampacket dpdatagrampacket new datagr...