编写计算机程序,实现点分十进制的IP地址标识方法

来源:百度知道 编辑:UC知道 时间:2024/06/08 15:48:01
编写计算机程序,实现点分十进制的IP地址标识方法,要求是从IP数据报头中取出源和目的地址,将它们以点分十进制表示输出.
请教高手 ,兄弟我急用!!!

想必如何得到IP数据报头已经不是问题了。那么我们就假设指针pIPheader指向IP数据报头吧。类型无所谓,因为我们可以强制转换。
源IP应该在IP数据报头第12字节开始,长度为4字节;目的IP地址应该在第16字节开始,长度为4字节.
DWORD IPs = *(DWORD *)((BYTE *)pIPheader+12);
DWORD IPd = *(DWORD *)((BYTE *)pIPheader+16);

一种方法是调用winsock函数inet_ntoa()将他们转换成点分十进制的字符串:
char strIPs[16], strIPd[16];
strcpy(strIPs, inet_ntoa(*(struct in_addr *)&IPs));
strcpy(strIPd, inet_ntoa(*(struct in_addr *)&IPd));
当然也可以不经过IPs, IPd, 直接从pIPheader做,但最好有个IP数据报头的结构定义,直接用pIPheader->saddr代替&IPs,用pIPheader->daddr代替&IPd. 根据你现有IP数据报头的结构定义做适当修改。

另一种方法是自己转换,其实一点儿也不复杂:
unsigned char strIPs[16], strIPd[16], *p;
p = (BYTE *)pIPheader + 12;
sprintf(strIPs, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
p = (BYTE *)pIPheader + 16;
sprintf(strIPd, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);