1. 程式人生 > >socket 封包和解包

socket 封包和解包

三.怎樣封包和拆包.
   最初遇到"粘包"的問題時,我是通過在兩次send之間呼叫sleep來休眠一小段時間來解決.這個解決方法的缺點是顯而易見的,使傳輸效率大大降低,而且也並不可靠.後來就是通過應答的方式來解決,儘管在大多數時候是可行的,但是不能解決象B的那種情況,而且採用應答方式增加了通訊量,加重了網路負荷(但是象FTP等協議採用的就是應答方式).再後來就是對資料包進行封包和拆包的操作.
    封包:
封包就是給一段資料加上包頭,這樣一來資料包就分為包頭和包體兩部分內容了(以後講過濾非法包時封包會加入"包尾"內容).包頭其實上是個大小固定的結構體,其中有個結構體成員變量表示包體的長度,這是個很重要的變數,其他的結構體成員可根據需要自己定義.根據包頭長度固定以及包頭中含有包體長度的變數就能正確的拆分出一個完整的資料包.
    對於拆包目前我最常用的是以下兩種方式.
    1.動態緩衝區暫存方式.之所以說緩衝區是動態的是因為當需要緩衝的資料長度超出緩衝區的長度時會增大緩衝區長度.
    大概過程描述如下:
    A,為每一個連線動態分配一個緩衝區,同時把此緩衝區和SOCKET關聯,常用的是通過結構體關聯.
    B,當接收到資料時首先把此段資料存放在緩衝區中.
    C,判斷快取區中的資料長度是否夠一個包頭的長度,如不夠,則不進行拆包操作.
    D,根據包頭資料解析出裡面代表包體長度的變數.
    E,判斷快取區中除包頭外的資料長度是否夠一個包體的長度,如不夠,則不進行拆包操作.
    F,取出整個資料包.這裡的"取"的意思是不光從緩衝區中拷貝出資料包,而且要把此資料包從快取區中刪除掉.刪除的辦法就是把此包後面的資料移動到緩衝區的起始地址.

相關推薦

socket 和解

三.怎樣封包和拆包.    最初遇到"粘包"的問題時,我是通過在兩次send之間呼叫sleep來休眠一小段時間來解決.這個解決方法的缺點是顯而易見的,使傳輸效率大大降低,而且也並不可靠.後來就是通過應答的方式來解決,儘管在大多數時候是可行的,但是不能解決象B的那種情況,而且採用應答方式增加了通訊量,加重了網路

TCP 協議及和解

關於這方面網上資料不少,主要篩選出了這幾篇講的比較有條理的文章來看。 說一下我是怎麼處理的: Recv接收資料,存入chSendbuff中; 判斷chSendBuff中的資料,是否大於一個自定義資料包的長度; 如果大於,則開始校驗自定義的包頭、包長

SOCKET 和拆

資源 isl 個數 遊戲服務器 指正 長度 num 部分 程序開發 對於基於TCP開發的通訊程序,有個很重要的問題需要解決,就是封包和拆包.自從我從事網絡通訊編程工作以來(大概有三年的時間了),我一直在思索和改進封包和拆包的方法.下面就針對這個問題談談我的想法,拋磚引玉.若

python中*和**的打包和解

新的 關鍵字參數 ast === 關鍵字 函數調用 none def alt python中的*和**,能夠讓函數支持任意數量的參數,它們在函數定義和調用中,有著不同的目的 一. 打包參數 * 的作用:在函數定義中,收集所有的位置參數到一個新的元組,並將這個元組賦值給變

socket編程 粘和半 問題的及處理

當前 多少 分包 轉義 保存 長連接 完整 過去 高效 一般在socket處理大數據量傳輸的時候會產生粘包和半包問題,有的時候tcp為了提高效率會緩沖N個包後再一起發出去,這個與緩存和網絡有關系。 粘包 為x.5個包 半包 為0.5個包 由於網絡原因 一次可能會來 0.5/

資料協議之TCP

資料封包協議規定:整個資料包包含2位元組長度資訊+資料包體。2位元組長度資訊包含本身著2位元組。如:資料體是(abcdefg)7個位元組,整體封包就是09abcdefg,總共是9個位元組的協議 1、netbus接收到資料後傳送到static void on_recv_tcp_data(uv_

WebSocket資料

websocket和TCP/IP多了一個握手協議(ws協議不用2位元組長度加資料體的協議) 1、ws_protocol類 class ws_protocol{ public: static bool ws_shake_hand(session* s, char* body, int l

python(歸檔和解)

歸檔和解包操作 (https://blog.csdn.net/abcdasdff/article/details/82528658) 歸檔:將多個檔案合併到一個檔案當中,這種操作方式就是歸檔。 解包:將歸檔的檔案進行釋放。 壓縮:壓縮時將多個檔案進行有損或者無損的合併到一個檔案

goim socket問題解決。[轉]

-(NSInteger)bytesToInt:(unsigned char*) data {     return (data[3]&255)|(data[2]&255)<<8|(data[1]&255)&

socket傳輸過程中產生的粘問題

這篇部落格中就出現了socket傳輸過程中的粘包拆包問題。就是因為socket傳送的是無界線的資料流。所以當多個包的大小不一,並且傳送出去的時候,緩衝區的大小不一樣,會導致包與包之間和合並和包的拆分問題。 對於上圖粘包、拆包問題的場景: 客戶端和伺服器建立一個

Unity C# 自定義TCP傳輸協議以及、解決粘問題(網路應用層協議)

本文只是初步實現了一個簡單的基於TCP的自定協議,更為複雜的協議可以根據這種方式去擴充套件。 網路應用層協議,通俗一點的講,它是一種基於socket傳輸的由傳送方和接收方事先協商好的一種訊息包組成結構,主要由訊息頭和訊息體組成。  眾所周知,基於socket的資訊互動有兩

Socket通訊中粘分包問題的介紹和解決(C#)

最近在做Unity區域網時,用到了Socket通訊基於TCP協議,然後使用非同步方式,主要用到了BeginAccept和BeginReceive方法 然而就可以實現非同步通訊,然而還是要解決粘包和分包問題 這裡我先說明一下什麼是分包和粘包,TCP提供面向連線的、可靠的資料流傳輸,所以當我們傳

網絡編程-TCP傳輸數據--

cti 建立 用戶 最長 操作 地址 fff 結束 發送數據 網絡編程 如果你要開發的程序基於網絡工作,要和其他計算機進行數據交互,就需要學會網絡編程.請你思考,網絡是什麽? 計算機之間相互傳輸數據,首先需要介質,可以是網線、光纖、無線電波,就能通過電(光)信號進行基本的0

網路程式設計-TCP傳輸資料--

網路程式設計 如果你要開發的程式基於網路工作,要和其他計算機進行資料互動,就需要學會網路程式設計.請你思考,網路是什麼? 計算機之間相互傳輸資料,首先需要介質,可以是網線、光纖、無線電波,就能通過電(光)訊號進行基本的0和1傳輸,可以被計算機識別. 同樣的100個電訊號,50個為一組和20個為一組,得到

最簡單的TCP網路(補充)-序列化

{public:    conststatic size_t DEFAULT_SIZE =0x1000;    ByteBuffer()        : mReadPos(0)        , mWritePos(0)    {        mStorage.reserve(DEFAULT_SIZE);

Socket/TCP粘、多和少, 斷

關於Tcp封包 很多朋友已經對此作了不少研究,也花費不少心血編寫了實現程式碼和blog文件。當然也充斥著一些各式的評論,自己看了一下,總結一些心得。 首先我們學習一下這些朋友的心得,他們是: //……………… 當然還有太多,很多東西粘來粘區也不知道到底是誰的原作,J 看這些朋友的blog是我建議親自看一

Python中 * 和 ** 的打包和解

python中的 * 和 ** ,能夠讓函式支援任意數量的引數,它們在函式定義和呼叫中,有著不同的目的。 一、打包引數 * 的作用:在函式定義中,收集所有位置引數到一個新的元組,並將整個元組賦值給變數args。 def f(*args): print(args) f() #

socket網路程式設計-粘

1.什麼是粘包只要tcp有粘包現象,udp不會粘包粘包主要問題是接收方不知道訊息之間的界限,不知道一次性提取多少位元組的資料而造成的tcp和dup的區別1.tcp是基於資料流的,收發的訊息不能為空,這酒需要在客戶端和服務端都新增空訊息的處理機制,防止程式卡主2.udp是基於資

java Socket 使用通用json 傳送 json物件

在使用json進行socket進行通訊中,由於伺服器使用的json 和 客戶端使用的json版本不同,因此改用通用的json包來通訊。 可以通用,而且不必使用其他的一些需要引入的其他json依賴包 文章中的例子是將一張圖片傳送到伺服器端,伺服器端收到資訊之後返回給客戶端

Python實戰之socket初版 Linux粘問題

網路: 1.理想的:應用 表示 會話 傳輸 網路 資料鏈路 物理層 2.現實: 應用 傳輸 網路 資料物理鏈路 應用層的所有協議最終:發send 和 收recieve 所以要封裝,這種封裝總體叫socket 所有的網路協議就是基於socket  如:http  s