Захват стандартного вывода tshark с помощью popen в C

Я пытаюсь захватить стандартный вывод из tshark через программу в C. Для этого я использую вызов popen () для открытия процесса tshark и чтения из возвращаемого streamа FILE.

Пример кода:

#include  #include  int main() { FILE* pipe_fd = popen("tshark -i eth0 -R icmp -2 -T fields -e icmp.checksum -e icmp.seq", "r"); //FILE* pipe_fd = popen("lsof", "r"); if (!pipe_fd) { fprintf(stderr, "popen failed.\n"); return EXIT_FAILURE; } char buffer[2048]; while (NULL != fgets(buffer, sizeof(buffer), pipe_fd)) { fprintf(stdout, "SO: %s", buffer); } pclose(pipe_fd); printf("tdr FINISHED!\n"); return 0; } 

Когда я запускаю его, я получаю только количество номеров пакетов, т. Е. Я не получаю информацию о пакетах, просто количество пакетов, причем каждое число переопределяет предыдущее в одном и том же месте (прокрутка строк не происходит).

Что-то вроде этого, я думаю, для 4 пакетов:

 tomas@ubuntu64:~$ sudo ./main tshark: Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:46: dofile has been disabled due to running Wireshark as superuser. See http://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged user. Running as user "root" and group "root". This could be dangerous. Capturing on 'eth0' 4 

Но если я изменил в программе C команду команды «tshark» на lsof, я получаю стандартный вывод просто отлично.

 tomas@ubuntu64:~$ sudo ./main lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. SO: COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME SO: init 1 root cwd DIR 8,1 4096 2 / SO: init 1 root rtd DIR 8,1 4096 2 / SO: init 1 root txt REG 8,1 265848 791529 /sbin/init SO: init 1 root mem REG 8,1 47712 824514 /lib/x86_64-linux-gnu/libnss_files-2.19.so ... 

С этим результатом я предполагаю, что есть что-то особенное в том, как tshark отправляет информацию на стандартный вывод. Кто-нибудь знает об этом поведении? Я собираюсь проверить исходный код tshark, чтобы узнать, может ли он его прояснить.

Просто последнее замечание.

Когда я запускаю tshark через оболочку, я часто получаю отсутствующие номера пакетов, например:

 tomas@ubuntu64:~$ sudo tshark -i eth0 -R icmp -2 -T fields -e icmp.checksum -e icmp.seq tshark: Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:46: dofile has been disabled due to running Wireshark as superuser. See http://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged user. Running as user "root" and group "root". This could be dangerous. Capturing on 'eth0' 0x0ee5 63045 1 0x8ae3 63046 2 0xcfdf 63047 3 0xe4d9 63048 4 0x9db7 63049 5 0x6798 63050 6 0x0175 63051 7 0x9e54 63052 0xa654 63052 9 0xe050 63053 0xe850 63053 11 0x8389 63054 0x8b89 63054 13 0x9b81 63055 0xa381 63055 

Отсутствуют печатные номера пакетов 8, 10, 12, 14.

И когда я перенаправляю stdout в файл, он не отправляет числа count:

 tomas@ubuntu64:~$ sudo tshark -i eth0 -R icmp -2 -T fields -e icmp.checksum -e icmp.seq > kk tomas@ubuntu64:~$ cat kk 0x2073 63321 0x2873 63321 0x7c6a 63322 

Другая подсказка, что tshark обрабатывает количество и количество распечатанных пакетов по-разному.

С уважением, Том

Ну, даже если я, наконец, не буду использовать этот способ работы с tshark, я думаю, что нашел возможность использовать, чтобы всплывать tshark. На странице руководства, опция -l :

Сбросьте стандартный вывод после печати информации для каждого пакета. (Это не является, строго говоря, строковым буфером, если задано значение -V, однако оно совпадает с буферизацией строки, если -V не указано, поскольку для каждого пакета печатается только одна строка и, как -l как правило, используется при подключении записи в реальном времени к программе или сценарию, так что вывод для пакета появляется, как только пакет просматривается и рассекается, он должен работать так же хорошо, как и истинная буферизация строк. Мы делаем это как обходной путь для недостатка в библиотеке Microsoft Visual C ++ C.)

Это может быть полезно при подключении вывода TShark к другой программе , так как это означает, что программа, на которую поступает вывод, будет видеть расчлененные данные для пакета, как только TShark увидит пакет и генерирует этот вывод, вместо того, чтобы видеть его только когда стандартный буфер вывода, содержащий эти данные, заполняется.

Я протестировал его и, похоже, сработал. На всякий случай кому-то это нужно.