LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 727|回复: 8

打印捕获包的端口号程序,编译出错:: dereferencing pointer to incomplete type

[复制链接]
发表于 2005-7-12 18:23:54 | 显示全部楼层 |阅读模式
我使用PCAP库写程序,PCAP库把捕获的原始包放在由u_char *packet指向的一段内存里,我在分析包里的源端口和目的端口时,引用了netinet/udp.h的数据定义:

  1. struct udphdr {
  2.   u_int16_t     source;   /* source port */
  3.   u_int16_t     dest;     /* destination port */
  4.   u_int16_t     len;
  5.   u_int16_t     check;
  6. };
复制代码


这样,我有一个struct udphdr *udpheader指针指向我捕获包的udp头开始处.
我打印此端口号时:
printf("%d", ntohs((uint16_t)udpheader->source);
此行的错误为:
dereferencing pointer to incomplete type
我查阅良久,依然不解,
请教各位,错误在哪里?
发表于 2005-7-12 20:08:00 | 显示全部楼层
%d??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-12 20:38:13 | 显示全部楼层
Post by nait
%d??


你的意思是?
我用%u,%s通通不管用.
回复 支持 反对

使用道具 举报

发表于 2005-7-12 21:07:32 | 显示全部楼层
我觉得应该用%u,改成这样呢?
printf("%u", ntohs(udpheader->source));

不知道是不是斑竹敲错了,struct udphdr 结构中明明定义的是u_int16_t,而你在printf语句中用的是uint16_t,难道这两个都是用typedef定义为unsighed short?对网络编程不是很熟悉,只能胡乱猜测
回复 支持 反对

使用道具 举报

发表于 2005-7-12 21:16:15 | 显示全部楼层
好像没问题啊~~~

  1. [rick@localhost ~]$ cat test.c
  2. #include <netinet/udp.h>
  3. #include <netinet/in.h>

  4. int main()
  5. {
  6.         struct udphdr* p;
  7.         printf("%dn",ntohs((uint16_t)p->source));
  8. }
复制代码

请原谅这段代码会产生的运行时错误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-12 21:29:33 | 显示全部楼层
赶紧封住这个帖子先,是我一时大意弄错了,我刚刚发现了问题的所在,大家别浪费时间看此帖了,稍后我把问题说一下(刚刚发现的,我先把程序调试好先),实在对不起.:sorry
回复 支持 反对

使用道具 举报

发表于 2005-7-12 21:49:18 | 显示全部楼层
这种问题一般都是和头文件有关的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-13 11:09:23 | 显示全部楼层
Post by nait
我觉得应该用%u,改成这样呢?
printf("%u", ntohs(udpheader->source));

不知道是不是斑竹敲错了,struct udphdr 结构中明明定义的是u_int16_t,而你在printf语句中用的是uint16_t,难道这两个都是用typedef定义为unsighed short?对网络编程不是很熟悉,只能胡乱猜测


这个我也想到了,这两个u_int16_t和uint16_t我都试过,最后查找之后的确是两个都定义为unsighed short


最后的错误很简单,我把struct udphdr搞成struct udp,结果定义指针为:
struct udp *pointer.
系统哪个头文件里可能也有一个struct udp定义的数据结构,编译后没有报错,结果我费了好多时间查找错误,都是粗心的后果. :beat
回复 支持 反对

使用道具 举报

发表于 2005-7-13 12:14:00 | 显示全部楼层
Post by kiron
这个我也想到了,这两个u_int16_t和uint16_t我都试过,最后查找之后的确是两个都定义为unsighed short


最后的错误很简单,我把struct udphdr搞成struct udp,结果定义指针为:
struct udp *pointer.
系统哪个头文件里可能也有一个struct udp定义的数据结构,编译后没有报错,结果我费了好多时间查找错误,都是粗心的后果. :beat

我看到过数据成员名称和这个不一样的struct udphdr
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表