csocketsnetwork-programminglibpcaplibnet

dereferencing pointer to incomplete type ‘struct tcphdr’?


I'm trying to compile "Example 11-9. Source code to the SYNplescan tool" from this NetworkSecurityTools book on Ubuntu 18.04: http://books.gigatux.nl/mirror/networksecuritytools/0596007949/networkst-CHP-11-SECT-4.html

But it says

error: dereferencing pointer to incomplete type ‘struct tcphdr’
     if (tcp->th_flags == 0x14)
            ^~

How do I fix this?


Solution

  • People change and includes come and go, after the following changes:

    @@ -1,9 +1,12 @@
    +#define _DEFAULT_SOURCE 1
     #define _BSD_SOURCE 1
     #include <stdio.h>
     #include <unistd.h>
     #include <time.h>
     #include <libnet.h>
     #include <pcap.h>
    +#include <netinet/tcp.h>
    +#include <netinet/ip.h>
     
     int answer = 0;            /* flag for scan timeout */
     
    @@ -42,7 +45,7 @@
     int
     main (int argc, char *argv[])
     {
    -  char *device = NULL;        /* device for sniffing/sending */
    +  const char *device = NULL;        /* device for sniffing/sending */
       char o;            /* for option processing */
       in_addr_t ipaddr;        /* ip address to scan */
       u_int32_t myipaddr;        /* ip address of this host */
    

    I was able to compile with:

    gcc -Wall 1.c -lnet -lpcap
    

    with no compiler messages. I guess that once netinet/tcp.h was included by libnet.h or maybe by pcap.h - seems not be the case anymore and you have to include netinet/tcp.h yourself for struct tcphdr.