【问题标题】:Assigning IP address in IP Header in C在 C 中的 IP 标头中分配 IP 地址
【发布时间】:2014-06-06 09:13:56
【问题描述】:

我正在为我的大学项目使用 C 中的原始套接字实现一个聊天室应用程序。我在分配 IP 地址时遇到问题。

从套接字接收到数据包。我正在解析它,如图所示。现在如何分配IP地址。

如果可能的话,我宁愿按照所示的方式进行操作(意味着使用 rcv_ip 作为字符)。因此,在提出使用 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);
}

现在解析IPHeader函数。

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);
}

谢谢:)

【问题讨论】:

    标签: c sockets ip-address


    【解决方案1】:

    您似乎认为 IP 地址是字符串,因为您尝试使用 printf()%s 格式说明符打印一个。这是不正确的; IP 地址在标头中是二进制的。

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

    阅读更多 IP 基础知识。

    【讨论】:

    • 是的.. 谢谢。这意味着我必须使用一些包含 ipaddress 的结构。 struct in_addr 会好吗?我想我需要这个结构的两个对象,然后为它们分配源 IP 和目标 IP。但是我将如何从 CreateIPHeader 函数返回两个 IP??
    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多