Browse Source

[feat]标准网络封包新增wireshark协议插件,便于分析网络包;StandardCodec支持编码基础类型

pull/141/head
大石头 1 year ago
parent
commit
65f59c0568
  1. 71
      Doc/newlife.lua
  2. 16
      NewLife.Core/Net/Handlers/StandardCodec.cs

71
Doc/newlife.lua

@ -0,0 +1,71 @@
do
local p_newlife = Proto("newlife", "新生命标准网络封包")
-- https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html#lua_class_ProtoField
local FF_flag = {
[8] = "[Reply]",
[7] = "[Error/Oneway]",
[3] = "[Encrypted]",
[2] = "[Compressed]",
[1] = "[Binary]"
}
local f_flag = ProtoField.uint8("NewLife.flag", "标记", base.HEX, FF_flag, 0xFF)
-- local f_flag = ProtoField.uint8("NewLife.flag", "标记", base.HEX)
local f_seq = ProtoField.uint8("NewLife.seq", "序列号", base.DEC)
local f_length = ProtoField.uint16("NewLife.length", "长度", base.DEC)
-- local f_data = ProtoField.string("NewLife.data", "内容", base.UNICODE)
local f_data = ProtoField.bytes("NewLife.data", "数据", base.SPACE)
p_newlife.fields = {f_flag, f_seq, f_length, f_data}
local data_dis = Dissector.get("data")
local function NewLife_dissector(buf, pkt, root)
local buf_len = buf:len();
if buf_len < 4 then
return false
end
local tvb = buf:range()
local v_flag = tvb(0, 1)
local v_seq = tvb(1, 1)
local v_length = tvb(2, 2)
local flag = tvb(0, 1):uint()
local len = tvb(2, 2):le_uint()
local v_data = tvb(4, len)
pkt.cols.protocol = "NewLife"
local t = root:add(p_newlife, buf)
t:add(f_flag, v_flag)
t:add(f_seq, v_seq)
t:add_le(f_length, v_length)
-- t:add_packet_field(f_data, v_data, ENC_UTF_8 + ENC_STRING)
t:add(f_data, v_data)
return true
end
function p_newlife.dissector(buf, pkt, root)
if NewLife_dissector(buf, pkt, root) then
-- valid NewLife diagram
else
data_dis:call(buf, pkt, root)
end
end
local udp_encap_table = DissectorTable.get("udp.port")
udp_encap_table:add(5500, p_newlife)
udp_encap_table:add(9999, p_newlife)
udp_encap_table:add(777, p_newlife)
udp_encap_table:add(12345, p_newlife)
local tcp_encap_table = DissectorTable.get("tcp.port")
tcp_encap_table:add(5500, p_newlife)
tcp_encap_table:add(9999, p_newlife)
tcp_encap_table:add(777, p_newlife)
tcp_encap_table:add(12345, p_newlife)
end

16
NewLife.Core/Net/Handlers/StandardCodec.cs

@ -1,6 +1,8 @@
using NewLife.Data;
using NewLife.Messaging;
using NewLife.Model;
using NewLife.Reflection;
using NewLife.Serialization;
namespace NewLife.Net.Handlers;
@ -18,6 +20,20 @@ public class StandardCodec : MessageCodec<IMessage>
/// <returns></returns>
public override Object? Write(IHandlerContext context, Object message)
{
// 基础类型
if (message is String str)
{
message = new Packet(str.GetBytes());
}
else if (message.GetType().GetTypeCode() != TypeCode.Object)
{
message = Binary.FastWrite(message);
}
else if (message is Byte[] buf)
{
message = new Packet(buf);
}
if (UserPacket && message is Packet pk)
message = new DefaultMessage { Payload = pk, Sequence = (Byte)Interlocked.Increment(ref _gid) };
else if (message is DefaultMessage msg && !msg.Reply && msg.Sequence == 0)

Loading…
Cancel
Save