Recvfrom () не получает все данные, отправленные в систему - PullRequest
1 голос
/ 23 апреля 2019

У меня есть код, похожий на этот, где я сканирую все порты виртуальной машины (10.0.0.1) из моей системы (10.0.0.2), используя raw_socket.

int main(){
int raw_sock = socket (AF_INET, SOCK_RAW, IPPROTO_TCP);
ip_header->ihl = 5;
ip_header->version = 4;
ip_header->tos = 0;
ip_header->tot_len =  sizeof (struct tcphdr) + sizeof (struct ip);
ip_header->id = htons (54321);
ip_header->frag_off = htons(16384);
ip_header->ttl = 64;
ip_header->protocol = IPPROTO_TCP;
ip_header->check = 0;
ip_header->saddr = inet_addr (source_ip);   
ip_header->daddr = destination_ip.s_addr;
...
//Same way I fill tcp header
tcp_header->source = htons (source_port);
tcp_header->dest = htons (80);
tcp_header->seq = htonl(1105024978);
tcp_header->ack_seq = 0;
tcp_header->doff = sizeof(struct tcphdr) / 4;       //Size of tcp header
tcp_header->fin=0;
tcp_header->syn=1;//Sending syn packet to the target
tcp_header->rst=0;
tcp_header->psh=0;
tcp_header->ack=0;
tcp_header->urg=0;
tcp_header->window = htons ( 14600);    // maximum allowed window size
tcp_header->check = 0;
tcp_header->urg_ptr = 0;
...
//Set IP_HDRINCL: Indicate kernel of header
...

//Create a thread to handle recv
int a = pthread_create(&thID, NULL, handle_receive, NULL);
...
destination.sin_family = AF_INET;
destination.sin_addr.s_addr = destination_ip.s_addr;
...
for(int i=1;i<=100;i++)
     sendto (raw_sock, packet ,...);

...
sleep(10);
return 0;//closes all program without waiting for threads to join
}

void* handle_receive(void *){
   while(1){
      data_size = recvfrom(raw_sock_global , buffer , 65536*128 , 0 , &saddr , &saddr_size);
   }
}

Здесь после отправки всех пакетов я даю 10-секундную задержку, чтобы система получила все ответы.

Я сканирую 1-100 портов ВМ (10.0.0.1), используя мою программу (с IP 10.0.0.2). У меня нет отфильтрованных портов на этой конкретной виртуальной машине. Поэтому он отвечает обратно с помощью RST + ACK на все 100 запросов sendto (которые я проверил из дампа tshark).

Даже когда я запускаю tshark в своей программной системе (10.0.0.2), я вижу, что все ответы возвращаются. Но иногда recvfrom не может обнаружить все ответы (которые я проверил, держа счетчик чуть ниже оператора recvfrom).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...