使用(学习)c 创建一个迷你数据包嗅探器,它将 src IP 添加到 json 对象并将它们添加到 json 数组。
pcap 过滤器可以正常工作,现在我正在尝试创建 src ips 的 json 对象和发送到该 IP 的数据包计数器。
{
"ips": [
{
"ip": "1.2.3.4",
"count": 10
},
{
"ip": "4.3.2.1",
"count": 103
}
]
}
排除所有 pcap 代码,我有一个循环:
pcap_loop(pcap, 1000, ethernet_packet, NULL);
在 ethernet_packet 函数中,我为 IP 创建了一个数组,这样我就可以检查是否已经添加了一个。
if (!array_contains(buf, src_ip)) {
// Do things
}
int array_contains(char *array, char *ip ) {
if ( strchr(array, *ip) )
return 1;
}
到目前为止,这是我应该获取 IP 并添加到数组中的内容:
void ethernet_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
static int count = 1;
printf("\nPacket number %d:\n", count); */
count++;
struct json_object *obj1, *obj2, *array;
array = json_object_new_array();
obj1 = json_object_new_object();
char buf[MESSAGE_BUFF_LEN];
/* Some Pcap stuff to get the ips etc. */
src_ip = inet_ntoa(ip->ip_src);
if (!array_contains(buf, src_ip)) {
/* Add IP to array */
sprintf(buf, src_ip);
/* Create a new object */
obj2 = json_object_new_object();
json_object *jstring = json_object_new_string(src_ip);
json_object_object_add(obj2,"ip", jstring);
/* Add to array */
json_object_array_add(array,obj2);
}
}
我遇到的问题是该对象没有添加到现有数组中,它每次都会创建一个新数组。
The json object created: [ { "ip": "79.65.10.0" } ]
The json object created: [ { "ip": "80.152.10.0" } ]
The json object created: [ { "ip": "99.211.10.0" } ]
我什至尝试在循环开始时检查对象的类型,并且仅在它不是数组时才进行初始化,但在尝试添加时会引发错误。
对于使用 c 超过 2 天的人来说,这可能很明显,但我不明白如何解决这个问题。
解决此问题的最佳/最有效方法是什么?
- - 编辑 - -
如果它不是数组,则通过检查类型和初始化来让它工作。只是不确定这是最好的方法。
fn 的完整代码在这里: