Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中分配IP头中的IP地址_C_Sockets_Ip Address - Fatal编程技术网

在C中分配IP头中的IP地址

在C中分配IP头中的IP地址,c,sockets,ip-address,C,Sockets,Ip Address,我正在为我的大学项目使用C中的原始套接字实现一个聊天室应用程序。我在分配ip地址时遇到问题 从套接字接收数据包。我正在解析它,如图所示。现在如何分配ip地址 如果可能的话,我更愿意以所示的方式使用rcv_ip作为char。因此,在给出使用struct in_addr的建议之前,请帮我解决这个问题。因为我尝试了其他的方法,这对我来说会产生更多的困惑 main() { char *rcv_ip; char *packet; int len; struct iphdr ip_header; rcv_i

我正在为我的大学项目使用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);
}

谢谢:

您似乎希望IP地址是字符串,因为您尝试使用printf和%s格式说明符打印IP地址。这是错误的;IP地址在报头中是二进制的

这意味着IPv4地址仅使用32位,而文本表示可能最多使用3+1+3+1+3+1+3=15个字符加上终止符,因此为16


阅读更多IP基础知识。

是的。。谢谢这意味着我必须使用包含ipaddress的结构。地址中的结构可以吗??我想我需要这个结构的两个对象,然后将源IP和目标IP分配给它们。但是如何从CreateIPHeader函数返回这两个IP??