lua中是 ffi 解析 【是如何处理数据包的/pkt是如何传进去的】

lua中的ffi是如何解析的呢?

拿bcc中对proto的解析说起;

metatype是有大学问的:

ffi.metatype(ffi.typeof(‘struct ip_t‘), {
    __index = {
        -- Skip IP header length (stored as number of words)
        -- e.g. hlen = 5, Header Length = 5 x sizeof(u32) = 20 octets
        -- Mask first nibble and shift by 2 (multiplication by 4)
        icmp = function(e, dst) next_offset(e, dst, ffi.typeof(‘uint8_t‘), 0, 0x0f, 2) end,
        udp  = function(e, dst) next_offset(e, dst, ffi.typeof(‘uint8_t‘), 0, 0x0f, 2) end,
        tcp  = function(e, dst) next_offset(e, dst, ffi.typeof(‘uint8_t‘), 0, 0x0f, 2) end,
    }
})

其中,ip_t就是

_G(pkg) 这是变量的最后一道屏障,如果在这里访问不到变量,那么lua就要报错了!

lua中的表真是高度抽象的一个概念:

pkg.ip.proto, pkg是全局的包,然后ip是这类变量的回调函数,proto又是ip的局部变量

在函数中metatype(‘struct net_t‘) 是一个

pkt是一个全局变量表示数据包,那么这个pkt变量是如何赋值的呢?

时间: 2024-10-02 19:24:15

lua中是 ffi 解析 【是如何处理数据包的/pkt是如何传进去的】的相关文章

iOS开发过程中,遇到解析的json数据为<null>,进行赋值时会导致崩溃,使用AFNetworking可以这样解决。

((AFJSONResponseSerializer *)manager.responseSerializer).removesKeysWithNullValues = YES;

android中使用tcpdump拦截分析网络数据包

1.下载tcpdumphttp://pan.baidu.com/s/1c0vkU2k 2.通过adb命令上传到手机里adb push tcpdump /system/bin 3.adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap 1 2 3 4 5 6 7 8 9 #tcpdump 用法: tcpdump -i any -p -s 0 -w /sdcard/capture.pcap 命令参数: # "-i any": listen

如何在Lua与C/C++之间实现table数据的交换

之前在<C/C++和Lua是如何进行通信的?>一文中简单的介绍了lua与宿主之间的通信.简单的说两种不同的语言之间数据类型不一样又如何进行数据交换呢?那就是lua_State虚拟栈,通过栈操作和lua库函数,我们很轻松就能完成两者之间的数据交换. 开始之前,明确几个问题,lua中的虚拟栈的索引编号问题(我们假设栈大小为n),编号1是栈底,n视栈顶,编号-1是栈顶,-n是栈底.lua中的库函数需要访问和操作栈上的数据都是通过索引编号定位的.但是我们需要明确一点,有些API并没有使用索引编号作为参

c#网络通信框架networkcomms内核解析之七 数据包创建器(PacketBuilder)

PacketBuilder 数据包创建器,用于辅助创建数据包. 程序把Tcp连接上收到的二进制数据暂时存储在 packetBuilder中,如果收到的数据足够多,程序会把数据包包头解析出来,并根据数据包包头中的数据,解析出数据包大小,根据数据包大小,从PacketBuilder中截取相应的二进制数据,把这部分数据以内存流(MemoryStream)的形式,加上数据包包头一起交给NetworkComms.CompleteIncomingItemTask()方法进行处理. PacketBuilder

Nodejs中puppeteer抓取浏览器HAR数据

有这么一个需求,首先从csv文件中读取要解析的url数据,然后使用puppeteer和puppeteer-har来获取浏览器的HAR数据.在调试的过程中,发现在for循环中怎么操作都是异步的,最后找到了一个解决方案,也算在此记录. har.js const puppeteer = require('puppeteer'); const PuppeteerHar = require('puppeteer-har'); /* (async () => { const browser = await

winPcap_5_打开适配器并捕获数据包

知道如何获取适配器的信息了,那我们就开始一项更具意义的工作,打开适配器并捕获数据包.编写一个程序,将每一个通过适配器的数据包打印出来. 打开设备的函数是 pcap_open(). (Open a generic source in order to capture / send (WinPcap only) traffic.) pcap_t* pcap_open ( const char * source, int snaplen, int flags, int read_timeout, st

Winpcap笔记3之打开适配器并捕获数据包

上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const char* source,int snaplen,int flags,int read_timeout,struct pcap_rmtauth *auth,char * errbuf):' pcap_rmatauth { int type. char *username;;//Zero-terminate

从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包

wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前全世界最广泛的网络封包分析软件 什么是ARP协议    协议分析篇第一个要研究的就是ARP协议.ARP(Address Resolution Protocol,地址解析协议)用于将IP地址解析为物理地址(MAC地址).这里之所以需要使用MAC地址,是因为网络中用于连接各个设备的交换机使用了内容可寻址

[RK_2014_0923]wireshark捕捉到的Ethernet II数据包的最小长度为60

一.关于wireshark中以太网数据包的最小长度,请看下面的文字: Packet format A physical Ethernet packet will look like this: Preamble Destination MAC address Source MAC address Type/Length User Data Frame Check Sequence (FCS) 8 6 6 2 46 - 1500 4 As the Ethernet hardware filters