0

printf()出力を保存して作成する代わりに、ストリームを利用して C++ でパケット スニファーを作成しています。私が遭遇した問題は、ストリームを使用して出力を生成するステートメントが 2 つ以上ある場合にrecvfrom()、失敗して戻ってくるように見えることです。-1

2 つの出力生成ステートメントの 1 つにコメントを付けると、プログラムは正常に実行されます。試行錯誤の結果std::setw()、ステートメントからを削除するstd::coutと、正しく動作し、パケットと「beef」メッセージの両方が表示されることがわかりました。

printf()私は途方に暮れていて、この問題は一度もなかったので(そしてストリームよりも速いので)使用に戻すことを検討しているので、アイデアや助けをいただければ幸いです。私がこれを使用ostringstreamしたのはこれが初めてであり、間違って使用している可能性があることを認めます.

私の簡略化されたソースコード:

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <linux/if_packet.h>

std::string BufferInHex( unsigned char * buffer, int length )
{
    std::ostringstream out;
    for( int i = 0; i < length; i ++ ) {
        if( i % 16 == 0 && i != 0 ) {
            out << "\n";
        }
        else if( i % 8 == 0 && i != 0 ) {
            out << "  ";
        }
        out << std::hex;
        out << std::setfill('0') << std::setw(2) << static_cast<unsigned>(buffer[i]) << " ";
        out << std::dec;
    }
    return out.str();
}

int main( void )
{
    struct sockaddr_ll saddr = {0};
    socklen_t saddr_size = sizeof(saddr);
    unsigned char packet[1500] = {0};

    int sockFd = socket( AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );
    if( sockFd < 0 ) {
        std::cerr << "Error creating socket!\n";
        return 1;
    }

    int data_size = recvfrom( sockFd, packet, sizeof( packet ), 0, (struct sockaddr*)&saddr, &saddr_size );
    if( data_size == -1 ) {
        std::cerr << "Error in recvfrom()\n";
        return 2;
    }

    std::cout << std::hex;
    std::cout << std::setw( 8 ) << ntohs( 0xADDE ) << "\n";
    std::cout << std::dec;
    std::cout << BufferInHex( packet, data_size ) << "\n";
    return 0;
}

次のコマンドを使用して、Centos 6.4 カーネル 2.6.32 で g++ でコンパイルされています。

g++ sniff.cpp -o sniff -Wall

アイデアや助けをありがとう、
ジェレマイア

4

0 に答える 0