Нужна помощь в модификации приложения C ++ для приема непрерывного конвейерного ввода в Linux - PullRequest
2 голосов
/ 15 марта 2010

Цель состоит в извлечении заголовков пакетов для URL-адресов, посещаемых с помощью tcpdump.

Пока что я могу сохранить заголовок пакета в файле, используя:

tcpdump "dst port 80 and tcp[13] & 0x08 = 8" -A -s 300 | tee -a ./Desktop/packets.txt

И я написал программу для анализа заголовка и извлечения URL-адреса при следующей команде:

cat ~/Desktop/packets.txt | ./packet-parser.exe

Но то, что я хочу сделать, это напрямую передать tcpdump в мою программу, которая затем запишет данные:

tcpdump "dst port 80 and tcp[13] & 0x08 = 8" -A -s 300 | ./packet-parser.exe

Вот сценарий как есть. Вопрос в том, как мне нужно изменить его для поддержки непрерывного ввода из tcpdump?

#include <boost/regex.hpp>
#include <fstream>
#include <cstdio> // Needed to define ios::app
#include <string>
#include <iostream>

int main()
{
    // Make sure to open the file in append mode
    std::ofstream file_out("/var/local/GreeenLogger/url.log", std::ios::app);
    if (not file_out)
        std::perror("/var/local/GreeenLogger/url.log");
    else
    {
        std::string text;
        // Get multiple lines of input -- raw
        std::getline(std::cin, text, '\0');
        const boost::regex pattern("GET (\\S+) HTTP.*?[\\r\\n]+Host: (\\S+)");
        boost::smatch match_object;
        bool match = boost::regex_search(text, match_object, pattern);
        if(match)
        {
            std::string output;
            output = match_object[2] + match_object[1];
            file_out << output << '\n';
            std::cout << output << std::endl;
        }
        file_out.close();
    } 
}

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 16 марта 2010

Вы должны будете внести некоторые большие изменения, чтобы заставить его работать. Ваш getline, ограниченный '\ 0', не прекратит работу, пока не увидит либо \ 0 (что не произойдет), либо вход не достигнет EOF. Вот почему это работает, когда вы используете файл (который в конечном итоге достигает EOF), но не с потоковой передачей прямо из tcpdump.

У меня проблемы с компиляцией с Boost, поэтому я все еще не совсем уверен, что это сработает. Но вы должны понять. [ Редактировать: Работает: -)]

 std::string text, line1, line2;

 std::getline(std::cin, line1);
 while(std::getline(std::cin, line2)) {
   text = line1 + '\n' + line2;
   // ...
   line1 = line2;
 }
 file_out.close();
0 голосов
/ 15 марта 2010

Редактировать : Извините, это совершенно неправильно.Смотрите новый ответ.

Я не пробовал, но это, вероятно, будет работать:

while(std::getline(std::cin, text, '\0')) {
  // ...
}
file_out.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...