2017-08-12 111 views
0

我試圖用C編寫一個簡單的自己的traceroute程序,使用原始套接字 但是當我編譯時,我得到錯誤信息「dereferencing pointer to不完整的類型「struct ip錯誤「解除指向不完整類型的指針」試圖寫入結構時ip

這些都是我包括頭:

#include <netinet/ip.h>   
#include <netinet/ip_icmp.h>   
#include <sys/socket.h>   
#include <stdlib.h>    
#include <stdio.h>    
#include <sys/types.h> 
#include <errno.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <ifaddrs.h> 

,然後我如何使用IP報頭

struct ip *myIpHeader = (struct ip*)buffr; 

接着一堆東西......然後:

myIpHeader->ip_v = 4;       
myIpHeader->ip_hl = 5;      
myIpHeader->ip_tos = 0;            
myIpHeader->ip_len = 20+8;     
myIpHeader->ip_off = 0;      
myIpHeader->ip_p = IPPROTO_ICMP;     
inet_pton(AF_INET, argv[1], &(myIpHeader->ip_dst)); 
inet_pton(AF_INET, ownip->h_name, &(myIpHeader->ip_src)); 
myIpHeader->ip_sum = 0;      
myIpHeader->ip_id = htonl(12345);      
myIpHeader->ip_ttl = ttl; 

然後我用它發送:

sendto(mysock, buffr, sizeof myIpHeader + sizeof myicmphead, 0, (struct sockaddr*)&cliAddr, sizeof cliAddr); 
+1

顯示完整的結構定義和聲明,可能你已經聲明瞭一個無名結構。 –

+1

不,你不能有一個指向匿名結構類型的指針,因爲你不能在其定義範圍之外引用一個匿名結構類型。因爲它是,你知道,匿名。 –

+1

但是你*可以*有一個指向其定義不在作用域中的命名結構類型的指針。你可以傳遞這樣一個指針,但不能對它進行解引用。 –

回答

1

將評論轉移到答案中。

在Mac上,頭<netinet/ip.h>確實含有struct ip - 但不是通過POSIX標準的標題。它也在Linux(Ubuntu 16.04)中。所以,看起來,當你進行解引用時,你沒有包含頭文件,或頭文件的內容是'不可見的'。

你正在編譯-std=gnu11-std=c11?如果是後者,您可能需要啓用POSIX(或GNU)定義。這很容易通過使用-std=gnu11來解決。或者,在源代碼中使用命令行上的-D_GNU_SOURCE-D_XOPEN_SOURCE=700或類似或類似的#define

是好還是壞,我用一個家庭釀造頭posixver.h

/* 
@(#)File:   $RCSfile: posixver.h,v $ 
@(#)Version:  $Revision: 1.4 $ 
@(#)Last changed: $Date: 2017/06/18 00:15:42 $ 
@(#)Purpose:  Request appropriate POSIX and X/Open Support 
@(#)Author:   J Leffler 
@(#)Copyright:  (C) JLSS 2010-2017 
*/ 

/*TABSTOP=4*/ 

#ifndef JLSS_ID_POSIXVER_H 
#define JLSS_ID_POSIXVER_H 

/* 
** Include this file before including system headers. By default, with 
** C99 support from the compiler, it requests POSIX 2008 support. With 
** C89 support only, it requests POSIX 1997 support. Override the 
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE. 
*/ 

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */ 
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */ 
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */ 

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE) 
#if defined(__cplusplus) 
#define _XOPEN_SOURCE 700 /* SUS v4, POSIX 1003.1 2008/13 (POSIX 2008/13) */ 
#elif __STDC_VERSION__ >= 199901L 
#define _XOPEN_SOURCE 700 /* SUS v4, POSIX 1003.1 2008/13 (POSIX 2008/13) */ 
#else 
#define _XOPEN_SOURCE 500 /* SUS v2, POSIX 1003.1 1997 */ 
#endif /* __STDC_VERSION__ */ 
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */ 

#endif /* JLSS_ID_POSIXVER_H */ 

您可以使用,如果你願意的話,有或沒有歸屬。您可以在https://github.com/jleffler/soq/tree/master/src/libsoq找到該文件的一個版本。

相關問題