環境限定:tcp/ip下的socket網路傳輸;c/c++開發語言,32/64位機。
目前有兩種方式對資料進行傳輸:1)字元流形式,即將資料用字串表示;2)結構型方式,即將資料按型別直接傳輸。
1)的方式保證所有的資料都是清晰的字串明文,沒有平台不一致問題,但傳輸的資料不定長,復合資料型別(如struct)的解析不方便。
2)的方式保證資料長度固定/可控,方便對接受到資料的解析;但前提是要考慮平台不一致問題,如位元組序、對齊位寬、資料型別等;
兩種資料傳輸方式應用時的注意點:
1)字元流形式 -- 需要協商好資料的解析方式,考慮到資料不定長可能導致的問題。
2)結構形式 -- 主要注意平台不一致導致的問題。
字元流傳輸方式相對簡單、安全,以結構方式傳輸則不同。結構形式傳輸資料時,要檢查下面各點:
1)首先要清楚是否有機器位寬不一致的情況,如32位機和64位機。如果位寬不一致,則避免傳輸表示方式不一致的資料型別,如long、float型在32位了64位下表示方式不一致,會導致資料解析錯誤。
2)確認通訊雙方的對齊位寬一致,或自己保證傳輸的資料結構在對齊調整後不會產生大小不一致。如果收發雙方的對齊方式分別是按4和8位元組對齊,則需要在程式中明確制定對齊位寬;或者調整資料的結構,確保在對齊調整後,收/發的資料中每一項的偏移量一致。
3)盡量對發出去的資料都轉換成網路位元組序,接收後轉換回本地位元組序,特別是機器字節序不一致時,現有的位元組序轉換函式不能滿足所有需求。
4)某些資料型別的表示方式有不同,如浮點數(一般用ieee 794標準),不能認為正確的傳了乙個位元組序正確的8位元組double型就對了,不同平台對double型的表示方式不同,比如傳送1.003,接受沒問題,結果卻得到了其它的數值。
傳結構型資料時對位元組序和浮點數的處理,以下的兩點網上的資料不多,詳細記錄一下:
1)目前沒有對8位元組或以上資料型別的轉換函式,需要自己實現,網上有很多,下面例舉乙個:
uint64_t htonll(uint64_t n)
uint64_t ntohll(uint64_t n)
如果有更長的資料(12位元組...),以此類推。
2)對浮點數之類的資料,如果要完全準確,那麼用字串傳送。如果直接傳資料,仍要處理位元組序,同時確保收發雙方對浮點數的表示方式一致。下面是兩個double型的位元組序轉換函式:
double ntoh_double(double net_double)
double hton_double(double host_double)
上述函式之所以沒有對host_double/net_double直接轉成uint64_t時會導致資料截斷。
網路資料(socket)傳輸總結
環境限定 tcp ip下的socket網路傳輸 c c 開發語言,32 64位機。目前有兩種方式對資料進行傳輸 1 字元流形式,即將資料用字串表示 2 結構型方式,即將資料按型別直接傳輸。1 的方式保證所有的資料都是清晰的字串明文,沒有平台不一致問題,但傳輸的資料不定長,復合資料型別 如struct...
SOCKET傳輸資料 檔案
函式 xsenddata 描述 傳送資料 引數 sock socket lpszbuff 緩衝區 ndatasize 資料長度 npacketsize 每次傳輸的資料塊長度 novertime 超時 秒 返回 實際傳輸的資料長度 int xsenddata socket sock,lpstr lps...
Socket資料傳輸
socket配置 通過socket呼叫返回乙個socket描述符後,在使用socket進行網路傳輸以前,必須配置該socket。面向連線的socket客戶端通過呼叫connect函式在socket資料結構中儲存本地和遠端資訊。無連線socket的客戶端和服務端以及面向連線socket的服務端通過呼叫...