0

私は C の初心者で、興味深い問題で立ち往生しています。

ポート 80 ですべての送信パケットをキャッチしており、IP ごとの転送速度を計算したいと考えています。しかし、問題は、これらの IP アドレスをグループ化する方法がわからないことです。PHP では、配列を作成し、IP によってエントリにインデックスを付けて配列を検索し、IP インデックスが既に存在する場合は、転送された値のバイトを更新し、それを経過秒数で割ります。転送速度は B/s です。しかし、CIではこれができません。

全体的な転送速度しか計算できないため、問題を解決する方法を教えてください。

  t2 = time(0);
  time_elapsed = (int) (t2-t1);
  if(time_elapsed > 0) {
    bytes += Size;
    //packets size SUM from all IP addresses, which is incorrect

    printf("IP: %s | Size: %d\n\n", inet_ntoa(dest.sin_addr), Size);
  }

出力

IP: 77.236.192.100 | Size: 4434

IP: 89.176.81.106 | Size: 43854

IP: 89.176.81.106 | Size: 20494

IP: 89.176.81.106 | Size: 24874

IP: 77.236.192.100 | Size: 7354

IP: 89.176.81.106 | Size: 39474

IP: 89.176.81.106 | Size: 16114
4

3 に答える 3

0

これを自分で実装しないでください。C で利用可能な膨大な量のライブラリの 1 つを使用してください。glib の例:

#include <glib.h>
#include <stdio.h>

unsigned lookup(GHashTable *dict, const char *key)
{
    return GPOINTER_TO_UINT(g_hash_table_lookup(dict, key));
}

void accumulate(GHashTable *dict, char *key, unsigned increment)
{
    unsigned value;

    value = lookup(dict, key);
    g_hash_table_insert(dict, key, GUINT_TO_POINTER(value + increment));
}

int main(void)
{
    GHashTable *ip;

    ip = g_hash_table_new(g_str_hash, g_str_equal);
    accumulate(ip, "10.1.1.1", 0);
    accumulate(ip, "10.10.10.10", 2);
    accumulate(ip, "10.1.1.1", 2);
    accumulate(ip, "10.1.1.1", 3);
    accumulate(ip, "10.2.2.2", 10);

    printf("%u\n", lookup(ip, "10.1.1.1"));
    printf("%u\n", lookup(ip, "10.10.10.10"));
    printf("%u\n", lookup(ip, "10.2.2.2"));

    g_hash_table_unref(ip);

    return 0;
}

出力:

$ ./hash 
5
2
10

https://developer.gnome.org/glib/2.38/glib-Hash-Tables.html

于 2013-11-09T16:37:45.197 に答える
0

C++ では、IP を含む文字列でアクセスできる連想コンテナーが必要な場合は、タイプのマップ コンテナーmap< string, float >を使用できます(もちろん、文字列を使用して IP を保存する場合)

次に、を実行するだけで要素にアクセスできますyourMapName[IPaddress]

Cで実行する必要がある場合は、IP アドレスを含むaを実行する必要がありstructます (純粋な C の場合は、おそらくchar*, と an を使用unsigned intします。次に、これらの構造体の配列と検索する関数を実行する必要があります。指定された構造体の配列とchar*intに追加するか、配列に新しいエントリを追加します。

構造体配列を柔軟にする必要がある場合 (接続する IP の数がわからないため)、mallocおよびfreeC 関数の使用方法を学習する必要があります。

したがって、純粋な C にこだわっていない場合は、C++ で行う方がはるかに簡単です。ほんのヒント、それはあなたの選択です。

于 2013-11-08T20:20:54.623 に答える