前面說到最近在寫python的一些東西,然後和另外一位小夥伴定義了協議,然後昨天我有一部分東西沒理解對,昨天上午我自己重寫了一遍接收和傳送的全部邏輯,昨天下午補了壓力測試的指令碼,自測沒問題之後告知聯調的小夥伴。
結果上午還是出了一點問題,然後我們兩對**,他寫了乙個python的實現。還好最後我這邊沒問題。(我也害怕是我這邊出問題啊,所以我自己的**都自己檢查了好幾遍)
簡單放一下他的實現:
import struct
import ctypes
class
e(exception):
def__init__
(self, what):
self.what = what
def__str__
(self):
return self.what
defunmarshall_packet
(pk):
if len(pk) < 12:
raise e("invalid pk header")
size, uri, prop_count = struct.unpack(", pk[:12]);
print
"size:%d uri:%d prop_count:%d" % (size, uri, prop_count)
if len(pk) - 12 != size - 8:
raise e("invalid pk length")
ss = pk[12:]
offset = 0
for x in range(0, prop_count):
# pop key
key_size, = struct.unpack_from(", ss, offset)
print
"key_size:%d" % (key_size,)
offset += 4
key, = struct.unpack_from("<%ds" % (key_size - 1,), ss, offset)
offset += key_size
# pop value
val_size, = struct.unpack_from(", ss, offset)
offset += 4
print
"val_size:%d" % (val_size,)
val, = struct.unpack_from("<%ds" % (val_size - 1,), ss, offset)
offset += val_size
print
"key:%s val:%s" % (key, val)
key1 = "key1"
val1 = "val1"
key2 = "key2"
val2 = "val2"
offset = 0
ss = ctypes.create_string_buffer(9085)
struct.pack_into(", ss, 0, 8 + 4 + len(key1) + len(val1) + len(key2) + len(val2) + 16, 2, 2)
offset += 12
struct.pack_into("% (len(key1), len(val1), len(key2), len(val2)), ss, offset, len(key1) + 1, key1, '\0',
len(val1) + 1, val1, '\0',
len(key2) + 1, key2, '\0',
len(val2) + 1, val2, '\0')
offset += len(key1) + len(val1) + len(key2) + len(val2) + 4 + 16
unmarshall_packet(ss[:offset])
"""hex=""
ss = bytearray.fromhex(hex)
unmarshall_packet(ss)
有很多可以學習的地方
乙個是python 的struct
對bytearray
的操作真是舒服,直接放進去就可以了(之前我有不少東西都是徒手解的,回頭再用這個優化下自己的**吧。)
另外乙個是vi寫**真是直接方便
要說缺點的話,應該是用私有協議,沒有第三方工具可以作為公證,例如postman
之類的。
自定義 如何自定義協議
何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...
自定義協議 你也可以自定義報頭協議
在學習過計算機網路的課程,我們知道剛開始計算機都是單獨離線工作的,沒有聯網的情況下計算機的資訊共享能力 運算能力都非常有限,後來誕生了計算機網路.有了就是那幾網路,計算機 a 的資訊和資料可以通過網路傳遞到計算機 b,同樣計算機 a 可以獲取到來自計算機 b 的資料.但是不同計算機之間交換資料的時候...
自定義協議族
include include include include define pf myfamily 28 static void stream csk destroy sock struct sock sk static void my proto close struct sock sk,lon...