Сокет получает пакет неправильно

Я написал простой необработанный сокет, который должен принимать отдельные пакеты ipv4, написанные и собранные с использованием libnet. Это код для пакета libnet, который работает просто отлично (я думаю, что не было никакого способа проверить фактическую полезную нагрузку, которая была отправлена):

int main() {
uint32_t src, dst, seq, ack;
char payload1[1024], destip[16];
uint16_t sp = 2001, dp = 2000;
libnet_ptag_t tcp;
libnet_ptag_t ip4;
char errbuf[LIBNET_ERRBUF_SIZE];
int i, bytes;
int len;
libnet_t * l;

l = libnet_init(LIBNET_RAW4, NULL, errbuf);

//here follows the usual declaration of addresses and the payload using scanf 
//and the command terminal (scanf("%s", payload);)


tcp = libnet_build_tcp(sp, dp, seq, ack, TH_SYN, 0, 0, 0, LIBNET_TCP_H + 
      strlen(payload), NULL, 0, l, 0);


ip4 = libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H + strlen(payload), 0, 1, 
0, 64, IPPROTO_TCP, 0, src, dst, payload, strlen(payload), l, 0);   


bytes = libnet_write(l);
return 0;
}

Эта программа работает, так как пакеты появляются в сети при использовании tcpdump. Теперь программа для необработанного сокета:

int main() {
struct sockaddr_in server_addr;
char message[2000];
int sockfd, bytes;

//server_addr is filled out for the listen() call...


sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);        

if(bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) 
{
printf("error binding\n");
perror("bind()");
exit(0);
}

while(1) {                                         
bytes = recv(sockfd, message, 2000, 0);
if(bytes == -1)
continue;

printf("captured %d bytes\n%s\n", bytes, message);
printf("as hex: %x\n", message);                   //I tried that to find 
                                                   //out, if there was any 
                                                   //kind of received message 
                                                   //because at first, the 
                                                   //socket didn't receive 
                                                   //anything, except that it 
                                                   //assured me the receiving 
                                                   //of ... bytes (, so I 
                                                   //wanted to print out the 
                                                   //raw bytes.)

 memset(message, 0, 2000);

}
}

Теперь сокету удается получить байты, поскольку в распечатанном значении байта отображается число, а также точное число, которое задается как размер пакета из первой программы (необработанный заголовок ipv4 + полезная нагрузка = 40 байт + размер полезной нагрузки). Похоже, что только само полученное сообщение страдает от какой-то ошибки, потому что, что бы я ни отправлял в своих пакетах, вывод%s сообщения всегда "E". Шестнадцатеричный вывод варьируется от пакета к пакету, но он не совпадает с шестнадцатеричной версией моей заданной полезной нагрузки (когда я распечатываю полезную нагрузку из программы пакетной передачи в шестнадцатеричном формате) и, безусловно, не имеет никакого соответствующего значения. Теперь я также подумал, что, возможно, заголовок ipv4 также получен в качестве сообщения, поэтому я написал версию, которая читает только 40+ байтов буфера сообщений, но результаты ("E" и случайный шестнадцатеричный код) совпадают.

Что я делаю неправильно? Может быть, это неправильная функция recv? Или мне нужно немного настроить тип моего буфера сообщений? Или это может быть ошибка в моей программе отправки пакетов?

0 ответов

Другие вопросы по тегам