2017-08-12 6 views
0

rawソケットを使用してLinux用のCで簡単なtracerouteプログラムを書き込もうとしましたが、コンパイル時に "dereferencing pointer to不完全なタイプ "struct ipです。struct 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です。

関連する問題