Может быть, я неправильно понимаю ваш вопрос (например, я не могу понять, «не хочу, чтобы сырые пакеты были только полезными данными TCP»), но подключен простой необработанный сокет (IPPROTO_TCP), а затем прослушан с помощью recv ()сделаю работу.Вы указываете максимальный размер буфера в качестве аргумента в recv (), но когда приходит загрузка TCP, об этом будет сообщено обратно - не дожидаясь заполнения буфера.Вот фрагмент кода, который печатает TCP-пакеты:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include // your header to print out bytes and error messages here
int main(void) {
int i, recv_length, sockfd;
u_char buffer[9000];
if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1)
// your error message here
for(i=0; i < 3; i++) {
recv_length = recv(sockfd, buffer, 8000, 0);
printf("Got a %d byte packet\n", recv_length);
// your routine to print out bytes here
}
}
Если это не то, что вас беспокоило, пожалуйста, уточните.
Редактировать: Из того, что я слышу и читаю, используяБиблиотека pcap (libcap) превосходит использование необработанных сокетов (более надежная; очень мощная - написана парнями, написавшими tcpdump).Тем не менее, я все еще изучаю pcap и до сих пор изо всех сил пытаюсь заставить его работать должным образом с беспроводными устройствами.Но, возможно, посмотрите на это тоже, если вам это нужно на постоянной основе.