IPアドレスをすばやく比較する最も賢い方法は?

エルマズン

次のように保存されたIPアドレスのリストがあります。

char IP_addresses_list[] = {
    "157.55.130", /* 157.55.130.0/24 */
    "157.56.52",  /* 157.56.52.0/24 */
    "157.12.53",  /* 157.12.53.0/24 */
    ...
};

スニッフィングされたパケットからIPアドレスを取得します(キャストしstruct iphdr *iph = (struct iphdr *)(packet + sizeof(struct ether_header));inet_ntop、;を使用して文字列に変換します。最後に、パケットのIPアドレスを次のコードでリスト内のIPアドレスと比較します。

/* 
* input: IP address to search in the list
* output: 1 if IP address is found in the list, 0 otherwise
*/
int find_IP_addr(char *server) {
    int ret = 0;
    int i, string_size1, string_size2;
    char *copied_server, *copied_const_char;
    char *save_ptr1, *save_ptr2;
    char dot[2] = ".";
    /* Here I store the IP address from the packet */
    char first_IPaddr_pkt[4], second_IPaddr_pkt[4], third_IPaddr_pkt[4];
    /* Here I store the IP address from the list */
    char first_IPaddr_list[4], second_IPaddr_list[4], third_IPaddr_list[4];

    string_size1 = strlen(server)+1;
    copied_server = (char *)malloc(string_size1 * sizeof(char));
    strcpy(copied_server, server);

    /* I store and compare the first three bits of the IP address */
    strcpy(first_IPaddr_pkt, strtok_r(copied_server, dot, &save_ptr1));
    strcpy(second_IPaddr_pkt, strtok_r(NULL, dot, &save_ptr1));
    strcpy(third_IPaddr_pkt, strtok_r(NULL, dot, &save_ptr1));  
    printf("tokenized %s, %s and %s\n", first_IPaddr_pkt, second_IPaddr_pkt, third_IPaddr_pkt);

    /* Now I scan the list */
    for (i=0; i<LIST_LENGTH; i++) {
        /* I copy an address from the list */
        string_size2 = strlen(IP_addresses_list[i])+1; // +1 for null character
        copied_const_char = (char *)malloc(string_size2 * sizeof(char));
        strcpy(copied_const_char, IP_addresses_list[i]);
        /* Let's split the address from the list */
        strcpy(first_IPaddr_list, strtok_r(copied_const_char, dot, &save_ptr2));
        strcpy(second_IPaddr_list, strtok_r(NULL, dot, &save_ptr2));
        strcpy(third_IPaddr_list, strtok_r(NULL, dot, &save_ptr2)); 
        printf("tokenized %s, %s and %s\n", first_IPaddr_list, second_IPaddr_list, third_IPaddr_list);
        /* I compare the first byte of the address from the packet I got and 
        the first byte of the address from the list:
        if they are different, there's no reason to continue comparing 
        the other bytes of the addresses */
        if (strcmp(first_IPaddr_pkt, first_IPaddr_list) != 0) {
            continue;
        }
        else  {
            if (strcmp(second_IPaddr_pkt, second_IPaddr_list) != 0) {
                continue;
        }
        else {
            if (strcmp(third_IPaddr_pkt, third_IPaddr_list) != 0) {
                continue;
            }
            else
                /* All the bytes are the same! */
                ret = 1;
            }
        }
        free(copied_const_char);
    }
    free(copied_server);
    return ret;
}

私は使用せず、これはもっと速くしたいのですがstrtokstrcmpmallocまたはfree/usr/include/netinet/ip.h、私そのアドレスがある見ます

u_int32_t saddr;
u_int32_t daddr;

inet_ntop最初に使用せずに比較することは可能u_int32_tですか?おそらく、2つのアドレスをまだ使用している間に比較するだけですか?

編集:これは、この質問を読む人のための解決策の例です。

#include <stdio.h>
#include <sys/types.h>

int main() {

    // In the list I have: 104.40.0.0./13
    int cidr = 13;
    u_int32_t ipaddr_from_pkt = 1747488105;     // pkt coming from 104.40.141.105
    u_int32_t ipaddr_from_list = 1747451904;    // 104.40.0.0
    int mask = (-1) << (32 - cidr);

    if ((ipaddr_from_pkt & mask) == ipaddr_from_list)
        printf("IP address belongs to the given range!!!\n");
    else printf ("failure\n");

    return 0;
}

bsearchヒントをくれたiharobにも感謝します。

PineForestRanch

バイナリデータを文字列に変換することは避けます。それらをバイナリのままにしておくと、比較するのは非常に簡単です。

match = (ip & listed_mask) == listed_ip;

「/ 24」はマスクです。本質的に24の最上位ビットが関連していることを意味します。次のようにバイナリマスクに変換します。

listed_mask = (-1) << (32 - 24);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Ipアドレスをすばやく取得する方法

分類Dev

多くのコマンドを解析する最も賢い方法は?

分類Dev

リストを比較するための最も賢くて最速の方法

分類Dev

Spring 3.1でのIPアドレスによる認証:そのための最も賢い方法は?

分類Dev

2 つのツールバー間でレイアウトを拡張する最も賢い方法は?

分類Dev

Doubleを最も近いIntにすばやく丸める方法は?

分類Dev

シーンの下部に最も近いスプライトノードをすばやく見つける方法

分類Dev

簡単なIPアドレス比較を行うための最もパフォーマンスの高い方法は何ですか?

分類Dev

Bashの何千ものCIDR /ネットマスク範囲でIPホストアドレスの数をすばやく効率的に取得する方法はありますか?

分類Dev

Django:2種類のクライアント(個人と企業)のモデルをアドレスモデルに接続する最も賢い方法は何ですか?

分類Dev

このdivにオーバーレイを配置する最も賢い方法は何ですか?

分類Dev

残りのpandas.DataFrameを取得する最も賢い方法は何ですか?

分類Dev

末尾の空白をすばやく削除する最もクリーンな方法は?

分類Dev

AMPMをすばやく比較する方法

分類Dev

アレイをすばやくフリーズする方法は?

分類Dev

eaaccessoryMACアドレスをすばやく取得する

分類Dev

JSでは、XY座標の整数をすばやく保存するための最もパフォーマンスの高い方法は何ですか

分類Dev

2つのIPアドレスをgrepして、最後の番号の値を増やす方法は?

分類Dev

PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

分類Dev

PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

分類Dev

PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

分類Dev

form.is_validの場合、ビューをテストする最も賢い方法は?

分類Dev

JavascriptでExcelの数式を作成する最も賢い方法

分類Dev

Ubuntuで動的IPアドレスとともに新しい静的IPアドレスを作成する方法

分類Dev

aptやその他のもののプロキシサーバーアドレスを維持するための最良の方法は何ですか?

分類Dev

数式を最もよく比較する方法は?

分類Dev

アドレス帳でカスタムラベルの電話番号をすばやく取得する方法

分類Dev

ワイルドカードを含むアレイでスイッチをすばやく使用する方法はありますか?

分類Dev

PythonでGoogleCompute EngineインスタンスのIPアドレスを取得する最も簡単な方法は何ですか?

Related 関連記事

  1. 1

    Ipアドレスをすばやく取得する方法

  2. 2

    多くのコマンドを解析する最も賢い方法は?

  3. 3

    リストを比較するための最も賢くて最速の方法

  4. 4

    Spring 3.1でのIPアドレスによる認証:そのための最も賢い方法は?

  5. 5

    2 つのツールバー間でレイアウトを拡張する最も賢い方法は?

  6. 6

    Doubleを最も近いIntにすばやく丸める方法は?

  7. 7

    シーンの下部に最も近いスプライトノードをすばやく見つける方法

  8. 8

    簡単なIPアドレス比較を行うための最もパフォーマンスの高い方法は何ですか?

  9. 9

    Bashの何千ものCIDR /ネットマスク範囲でIPホストアドレスの数をすばやく効率的に取得する方法はありますか?

  10. 10

    Django:2種類のクライアント(個人と企業)のモデルをアドレスモデルに接続する最も賢い方法は何ですか?

  11. 11

    このdivにオーバーレイを配置する最も賢い方法は何ですか?

  12. 12

    残りのpandas.DataFrameを取得する最も賢い方法は何ですか?

  13. 13

    末尾の空白をすばやく削除する最もクリーンな方法は?

  14. 14

    AMPMをすばやく比較する方法

  15. 15

    アレイをすばやくフリーズする方法は?

  16. 16

    eaaccessoryMACアドレスをすばやく取得する

  17. 17

    JSでは、XY座標の整数をすばやく保存するための最もパフォーマンスの高い方法は何ですか

  18. 18

    2つのIPアドレスをgrepして、最後の番号の値を増やす方法は?

  19. 19

    PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

  20. 20

    PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

  21. 21

    PHPでユーザーの正しいIPアドレスを取得する最も正確な方法は何ですか?

  22. 22

    form.is_validの場合、ビューをテストする最も賢い方法は?

  23. 23

    JavascriptでExcelの数式を作成する最も賢い方法

  24. 24

    Ubuntuで動的IPアドレスとともに新しい静的IPアドレスを作成する方法

  25. 25

    aptやその他のもののプロキシサーバーアドレスを維持するための最良の方法は何ですか?

  26. 26

    数式を最もよく比較する方法は?

  27. 27

    アドレス帳でカスタムラベルの電話番号をすばやく取得する方法

  28. 28

    ワイルドカードを含むアレイでスイッチをすばやく使用する方法はありますか?

  29. 29

    PythonでGoogleCompute EngineインスタンスのIPアドレスを取得する最も簡単な方法は何ですか?

ホットタグ

アーカイブ