我正在使用C中的原始套接字为我的大学项目实现一个聊天室应用程序。我有分配IP地址的问题。
从套接字接收数据包。我正在解析它如图所示。现在如何分配IP地址。
如果可能的话,我宁愿以显示的方式(使用rcv_ip作为char)来实现。所以在给出使用 struct in_addr 的建议之前,请帮我解决这个问题。因为我尝试了其他方法,这进一步给我带来了其他的困惑。
main()
{
char *rcv_ip;
char *packet;
int len;
struct iphdr ip_header;
rcv_ip=ParseIPHeader(packet,len);
printf("\n %s ",rcv_ip); //printing some junk
printf("\n %s ",inet_addr(rcv_ip)); //giving seg fault
printf("\n %s",inet_ntoa(*((struct in_addr*)ip_header->daddr))); //printing correct ip
ip_header CreateIPHeader(rcv_ip+5,rcv_ip);
}
现在ParseIPHeader功能。
char *ParseIPHeader(packet,len)
{
struct iphdr *ip_header;
struct ethhdr *eth_header;
char *ret_ip;
ip_header=(struct iphdr *)(packet+sizeof(struct ethhdr));
ret_ip=malloc(10);
memset(ret_ip,0,10);
memcpy(ret_ip,&(ip_header->daddr),sizeof(ip_header->daddr));
memcpy(ret_ip+5,&(ip_header->saddr),4);
return ret_ip;
}
struct iphdr *CreateIPHeader(char *src_ip,char *dst_ip)
{
struct iphdr *ip_header;
ip_header=malloc(sizeof(struct iphdr));
//main part. How to do this??
ip_header->saddr = inet_addr(src_ip); //please correct it.
ip_header->daddr = inet_addr(dst_ip);
return(ip_header);
}
谢谢:)
答案 0 :(得分:0)
您似乎期望IP地址是字符串,因为您尝试使用printf()
和%s
格式说明符打印一个。这是不正确的; IP地址在标题中是二进制的。
这意味着IPv4地址仅使用32位,而文本表示最多可使用3 + 1 + 3 + 1 + 3 + 1 + 3 = 15个字符(加上终结符,所以16)。
了解更多IP基础知识。