網路資料傳輸格式 轉CSDN 貼

2022-09-16 09:09:12 字數 1163 閱讀 8270

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...