首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C套接字编程:可以绑定getaddrinfo()和get设备IP服务器

C套接字编程:可以绑定getaddrinfo()和get设备IP服务器
EN

Stack Overflow用户
提问于 2017-05-22 04:16:07
回答 1查看 737关注 0票数 0

我正在使用getaddrinfo()创建被动服务器套接字(正如我读到的“现代”方法)。使用这种方法并在提示中指定: AI_PASSIVE,AF_UNSPEC,sock_type I循环结果如下:

代码语言:javascript
运行
复制
 for(ai_ptr = addrinfo_res; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next)

然后创建套接字并绑定到在第一个addrinfo_res中找到的地址。

代码语言:javascript
运行
复制
 bind(ps_fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen)

我如何知道我的服务器在局域网中的哪个地址(不是0.0.0.0)?

我尝试了下面的代码来查找它们上的所有接口和IP地址:

代码语言:javascript
运行
复制
 // linked list of structures describing
    // the network interfaces of the local system
    struct ifaddrs *ifaddr, *ifa;
    int n, gai_err;

    if(getifaddrs(&ifaddr) == FAILURE) {
        fprintf(stderr, "getifaddrs: %s\n", strerror(errno));
        return FAILURE;
    }

    // walk through linked list
    for(ifa = ifaddr, n=0; ifa != NULL; ifa = ifa->ifa_next, n++) {

        if(ifa->ifa_addr == NULL)
            continue;

        int family = ifa->ifa_addr->sa_family;

        // display interface name, family
        printf("%-8s %s (%d)\n", ifa->ifa_name,
               (family == AF_INET) ? "AF_INET" :
               (family == AF_INET6) ? "AF_INET6" : "???",
               family);

        // for an AF_INET* interface addresses, display the address
        if(family == AF_INET || family == AF_INET6) {

            char host[NI_MAXHOST];

            if( (gai_err = getnameinfo(ifa->ifa_addr,
                        (family == AF_INET) ? sizeof(struct sockaddr_in) :
                                              sizeof(struct sockaddr_in6),
                        host, NI_MAXHOST,
                        NULL, 0, NI_NUMERICHOST)) != 0) {
                fprintf(stderr, "getnameinfo: %s\n", gai_strerror(gai_err));
            }

            printf("\t\t address: <%s>\n", host);
        }
    }

    freeifaddrs(ifaddr);
    return SUCCESS;

但是我如何确定我将返回(打印)客户端可以连接到的合适的IP地址?

我有这样的结果:

代码语言:javascript
运行
复制
lo0      ??? (18)
lo0      AF_INET (2)
         address: <127.0.0.1>
lo0      AF_INET6 (30)
         address: <::1>
lo0      AF_INET6 (30)
         address: <fe80::1%lo0>
gif0     ??? (18)
stf0     ??? (18)
en0      ??? (18)
en0      AF_INET6 (30)
         address: <fe80::1088:e458:89a7:7ee9%en0>
en0      AF_INET (2)
         address: <192.168.8.102>
en1      ??? (18)
bridge0  ??? (18)
p2p0     ??? (18)
awdl0    ??? (18)
awdl0    AF_INET6 (30)
         address: <fe80::dce1:4eff:fef8:f3bd%awdl0>
utun0    ??? (18)
utun0    AF_INET6 (30)
         address: <fe80::695f:8478:f380:9efb%utun0>

我测试的服务器仅在192.168.8.102或IPv6 ::ffff:192.168.102上可用。但是在第二个en0 AF_INET6 IP地址fe80::1088:e458:89a7:7ee9上。如何确保其他人在另一台具有不同IP地址和接口(如不是en0而是eth0?)的计算机上使用此程序?我将有可能返回正确的IP地址我的服务器是可用的,以便他/她知道它可以从客户端程序连接到哪个IP?

EN

回答 1

Stack Overflow用户

发布于 2017-05-22 05:13:04

您不能确定,因为任何系统都可以有多个具有不同网络和地址的接口。甚至返回的路由也不必与到系统的路由相同。

此外,由于客户端和服务器之间的任何位置都存在NAT,客户端可能必须连接到不同的地址和端口。

您可以使用IP_PKTINFO套接字选项从recvmsg获取地址,以查看消息要发往哪个地址,但同样,这也可以在网络级别进行转换。

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

https://stackoverflow.com/questions/44101350

复制
相关文章

相似问题

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