我将tcp syn数据包发送到不存在的Ip,但是没有得到响应

时间:2019-01-18 02:52:44

标签: c linux sockets tcp

我在c中写了tcp syn portscan 当我发送tcp syn到一个存在的ip时,它运行良好 但是当我发送到不存在的ip时,函数sendto()<0不起作用,那是什么问题?

我在ubuntu18上使用代码块和gcc

这是代码的一部分

//Create a raw socket
  int s = socket (AF_INET, SOCK_RAW, IPPROTO_TCP);

//IP_HDRINCL to tell the kernel that headers are included in the packet
  int one = 1;
  const int *val = &one;
  setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one);

// send syn packet
   if ( sendto (s, datagram, sizeof(struct iphdr) + sizeof(struct tcphdr), 0, (struct sockaddr *) &dest, sizeof (dest)) < 0){
  {
            printf ("Error sending syn packet. Error number : %d . Error message : %s \n",errno, strerror(errno));
            exit(0);
        }}

当我调试看到sendto()的返回值时,它为-1, 但是if(sendto()<0)不起作用,

1 个答案:

答案 0 :(得分:0)

对于本地检测到的错误,您只会获得-1的返回值,一旦数据包在网络上发送出去,就将发送到它。

man sendto

  

send()中没有隐式表示无法交付失败的指示。在本地   检测到的错误由返回值-1表示。

// send syn packet
size_t ret_code = sendto (s,datagram, 
                         sizeof(struct iphdr) + sizeof(struct tcphdr),
                         0,(struct sockaddr *) &dest, sizeof (dest)) ;
// ret_code will be length if successful, else -1      

if ( ret_code ==-1){
        // If packet successfully sent out on interface but dropped by router along path, this is not triggered.
        printf ("Error sending syn packet. Error number : %d . Error message : %s \n",errno, strerror(errno));
        exit(0);
}