2016-06-21 6 views
0

RAWソケットでパケットを受信するためにLinux(バージョン3.19)でAIOを動作させるのには苦労していますが、役に立たないものです。私は正常にUDPとTCPソケットにAIOを使用しましたが、RAWソケットでは動作させられません。私はIPv4とIPv6の両方を試しました。Linux AIOはRAWソケットをサポートしていますか?

AIOがRAWソケットをサポートするかどうかは知りませんか?ここで

は自分のアプリケーションからいくつかのコードスニペットです:

void readCallback(sigval_t sigval) { 
    debug(LOG_DEBUG, "RAW packet received\n"); 
} 

int main(int argc, char *argv[]) { 
    int sock = socket(domain, SOCK_RAW, IPPROTO_RAW); 
    if (-1 == sock) { 
    debug(LOG_CRIT, "FAILED to create raw socket\n"); 
    return 1; 
    } 

    char *iface = "eth0"; 
    ifreq ifr; 
    memset (&ifr, 0, sizeof(ifr)); 
    snprintf (ifr.ifr_name, sizeof(ifr.ifr_name), "%s", iface); 
    if (ioctl (sock, SIOCGIFINDEX, &ifr) < 0) { 
    debug(LOG_CRIT, "FAILED to query interface '%s' index\n", iface); 
    return 1; 
    } 

    // Set flag so socket expects us to provide IP header. 
    const int on = 1; 
    if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) { 
    debug(LOG_CRIT, "FAILED to configure raw socket on '%s'\n", iface); 
    return 1; 
    } 

    // Bind socket to interface index. 
    if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0) { 
    debug(LOG_CRIT, "FAILED to bind socket to %s/%u\n", iface, ifr.ifr_ifindex); 
    return 1; 
    } 

    // listen for packets 
    struct aiocb aio; 
    char buf[MAX_PACKET]; 
    bzero((char*)&aio, sizeof(struct aiocb)); 
    aio.aio_fildes = sock; 
    aio.aio_buf = &buf; 
    aio.aio_nbytes = MAX_PACKET; 
    aio.aio_offset = 0; 
    aio.aio_sigevent.sigev_notify = SIGEV_THREAD; 
    aio.aio_sigevent.sigev_notify_function = readCallback; 
    aio.aio_sigevent.sigev_notify_attributes = NULL; 
    aio.aio_sigevent.sigev_value.sival_ptr = buf; 
    if (!RequestAioRead(&aio)) { 
    debug(LOG_DEBUG, "FAILED to listen on raw socket...\n"); 
    return 1; 
    } 
    debug(LOG_DEBUG, "Listening on raw socket...\n"); 

    // main loop 
    while (true) { 
    usleep(100000); 
    } 
    close(sock); 
    return 0; 
} 
+0

はい、そうです。申し訳ありませんが、あなたのコードatmを見る時間がありません。 –

+0

お返事ありがとうございます。少なくとも私はそれが*動作すべきであることを知っています。私は掘り続けます。 – HannesM

+0

あなたの回答から、私はトラブルシューティングを続けることができました。ソケットプロトコルが間違っていることが判明しました。正しいプロトコルはhtons(0x0800)のようです: ソケット(AF_PACKET、SOCK_RAW、htons(0x0800)); これで、aioは正常に動作しているようです。 お返事ありがとうございます! – HannesM

答えて

0

は私のソケット()プロトコルが間違っていたが判明します。正しいプロトコルはhtons(0x0800)のようです:

socket(AF_PACKET, SOCK_RAW, htons(0x0800)); 

これで、aioは正常に動作しているようです。

関連する問題