使用C将唯一元素添加到Json对象

时间:2015-08-30 14:00:14

标签: c pcap json-c

使用(学习)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

1 个答案:

答案 0 :(得分:0)

这是错误的

buf

因为strchr是使用垃圾进行初始化的,因为它是局部变量,因此对其内容执行/* Add to array */ json_object_array_add(res,obj2); // ^^^ 并不是您想要的。

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

typedef NTSTATUS(*ThreadInfoProc)(HANDLE, THREADINFOCLASS, PVOID, ULONG,  PULONG);
PVOID CProcessHelper::GetThreadStackTopAddress(HANDLE hThread)
{
HINSTANCE ntdllInstance;
ThreadInfoProc NtQueryInfoThread;

ntdllInstance = LoadLibrary("Ntdll.dll");

if (ntdllInstance != NULL)
{
    NtQueryInfoThread = (ThreadInfoProc)GetProcAddress(ntdllInstance, "NtQueryInformationThread");

    if (NtQueryInfoThread != NULL)
    {

        THREAD_BASIC_INFORMATION bi;
        NT_TIB tib;

        NTSTATUS ntstat = 0;
        NTSTATUS ntstat = (NtQueryInfoThread)(hThread, (THREADINFOCLASS)0, &bi, sizeof(THREAD_BASIC_INFORMATION),NULL);

        ReadProcessMemory(CurrentProcessHandle, bi.TebBaseAddress, &tib, sizeof(NT_TIB), 0);

        PrintHex(tib.StackBase); // output: CCCCCCCCCC
    }
}

return nullptr;
}