我試圖用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);
顯示完整的結構定義和聲明,可能你已經聲明瞭一個無名結構。 –
不,你不能有一個指向匿名結構類型的指針,因爲你不能在其定義範圍之外引用一個匿名結構類型。因爲它是,你知道,匿名。 –
但是你*可以*有一個指向其定義不在作用域中的命名結構類型的指針。你可以傳遞這樣一個指針,但不能對它進行解引用。 –