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 の配列を作成して、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