1

ネットワークからすべてのパケットを収集する単純なアプリケーションを Linux で作成しています。「recvfrom()」関数を呼び出して受信をブロックしています。hping3 で大きなネットワーク負荷 (1 秒あたり最大 100k の生フレーム、それぞれ 130 バイト) を生成すると、「トップ」ツールはプロセスの CPU 使用率が高いことを示します - 約 37-38% です。それは私にとって大きな価値です。パケット数を減らすと、使用率が低くなります。たとえば、1 秒あたり 4k フレームの場合、top は 3% を示します。
DC++ が 10MB/s までダウンロードし、そのプロセスが CPU の 38% ではなく 5% を使用している場合に、DC++ をチェックしました。CでCPU使用率を減らし、それでも多くのフレームを受信するプログラム可能な方法はありますか?

私の CPU: Intel i5-2400 CPU @ 3.10Ghz

私のシステム: PREEMPT-RT パッチを適用した Ubuntu 11.04 カーネル 3.6.6

そして、ここに私のコードがあります:

#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <arpa/inet.h>

/* Socket descriptor. */
int mainSocket; 

/* Buffer for frame. */
unsigned char* buffer;

int main(int argc, char* argv[])
{
    /** Create socket. **/  
    mainSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (mainSocket == -1) { 
        printf("Error: cannot create socket!\n");
    }

    /** Create buffer for frame **/
    buffer = malloc(ETH_FRAME_LEN);

    printf("Listing...");

    while(1) {

        // Length of received packet
        int length = recvfrom(mainSocket, buffer, ETH_FRAME_LEN, 0, NULL, NULL);
        if(length > 0) 
        {   
            // ... do something ...
        }
    }
4

2 に答える 2

2

これが役立つかどうかはわかりませんが、Googleを見ると次のことがわかります。

無差別に受け取りますかDC++?私はそうは思いませんでした。したがって、パフォーマンスをと比較する代わりにDC++、パフォーマンスをのようなユーティリティのパフォーマンスと比較する必要がありますlibpcap

于 2013-01-03T19:52:32.933 に答える