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);
完全な構造体定義と宣言を示していますが、おそらく名前のない構造体が宣言されています。 –
いいえ、参照の型が完全ではない匿名の構造体型へのポインタを持つことはできません。匿名の構造体型をその定義の範囲外から参照することはできないからです。それはあなたが知っているので、匿名です。 –
しかし、その定義がスコープ内にない名前付き構造体型へのポインタを持つことができます。そのようなポインタを渡すことはできますが、逆参照はできません。 –