0

使用(学习)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 的完整代码在这里:

https://gist.github.com/simonmorley/9850f2a42453e4f54b75

4

1 回答 1

0

这是错误的

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)) {

因为buf是用垃圾初始化的,因为它是局部变量,所以strchr对它的内容做不是你想要的。

此外,您似乎没有将对象添加到正确的数组中:

/* Add to array */
json_object_array_add(res,obj2);
//                    ^^^
于 2015-08-30T14:10:18.197 回答