首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按价值复制?

如何按价值复制?
EN

Stack Overflow用户
提问于 2015-08-24 11:26:44
回答 2查看 2.1K关注 0票数 0

我正在研究下面的函数来解析CIDR表示法,并最终返回所有IP地址的数组。

不过,我在这一行遇到了一个问题:network_addr = last_addr = addr.s_addr;

我需要三个变量,保存网络地址,最后地址,和原始地址,以便我可以应用位移位运算符。但是,就目前而言,它似乎是在借鉴addr.s_addr

如何按价值复制?

代码语言:javascript
复制
int parse_ipv4_cidr(char *ip_cidr)
{
    struct in_addr addr;
    int cidr;
    char *token;
    uint32_t netmask, network_addr, last_addr;

    token = strtok(ip_cidr, "/");

    /*
     *  Validate IPV4 CIDR address
     */
    if(!inet_aton(token, &addr) ||
       !(token = strtok(NULL, "/")) ||
       (atoi(token) < 0 || atoi(token) > 32))
    {
        printf("Invalid CIDR notation. Example format: 192.0.0.1/21\n");
        return 1;
    }

    cidr = atoi(token);
    network_addr = last_addr = addr.s_addr;

    /*
     *  Create the netmask
     */
    netmask = 0xFFFFFFFF;
    netmask <<= 32 - cidr;
    netmask = ntohl(netmask);

    /*
     *  Calculate network address
     */
    network_addr = network_addr & netmask;

    /*
     *  Calculate last address
     */
    last_addr = (last_addr & netmask) + ~netmask;

    ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-24 11:41:09

我认为您的问题不是引用/按值复制(您已经在按值复制)。在我看来,你好像搞砸了网络/主机字节顺序。

sa_addr字段struct in_addr是按网络字节顺序排列的;当您将其复制到network_addrlast_addr时,应该将其转换为宿主字节顺序,因为您将进行移位和其他操作。

此外,由于某种原因,代码假定netmask是按网络字节顺序排列的,而实际上它是按主机字节顺序排列的。事情不会加起来的。

只要坚持主机字节顺序,一切都会正常工作。

更改这一行:

代码语言:javascript
复制
network_addr = last_addr = addr.s_addr;

至:

代码语言:javascript
复制
network_addr = last_addr = ntohl(addr.s_addr);

并删除这一行:

代码语言:javascript
复制
netmask = ntohl(netmask);

您可能希望最后添加return network_addr;,并可能将返回类型更改为uint32_t

票数 2
EN

Stack Overflow用户

发布于 2015-08-24 12:04:55

您可能需要malloc您的新变量,然后memcpy旧变量到您的新变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32181183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档