Recvfrom()未接收到发送到系统的所有数据

时间:2019-04-23 16:07:29

标签: c sockets

我有一个类似以下的代码,其中我正在使用raw_socket扫描系统(10.0.0.2)中VM(10.0.0.1)的所有端口。

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秒,以便系统接收所有答复。

我正在使用我的程序(IP 10.0.0.2)扫描VM(10.0.0.1)的1-100端口。我在该特定VM上没有任何筛选的端口。因此,它使用RST + ACK回复了所有100个sendto请求(我从tshark dump进行了验证)。

即使我在程序系统(10.0.0.2)上运行tshark,也可以看到所有回复。但是recvfrom有时有时无法检测到所有答复(我检查过将计数器保留在recvfrom语句的下方)。

我增加了recvfrom的缓冲区大小,认为可能是问题所在,但没有帮助。同样增加睡眠时间也无济于事。

0 个答案:

没有答案