gpt4 book ai didi

C套接字编程: binding with getaddrinfo() and get device IP server is available

转载 作者:行者123 更新时间:2023-11-30 16:45:26 26 4
gpt4 key购买 nike

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

 for(ai_ptr = addrinfo_res; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next)

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

 bind(ps_fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen)

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

我尝试了下面的代码来查找所有接口(interface)及其 IP 地址:

 // 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 地址?

我有这样的结果:

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 地址和接口(interface)(例如不是 en0 而是 eth0?)的计算机上使用此程序时,我将可以返回正确的 IP 地址,我的服务器可用,以便他/她知道哪个 IP它可以从客户端程序连接吗? enter image description here

最佳答案

您无法确定,因为任何系统都可以有多个具有不同网络和地址的接口(interface)。即使返回的路由也不必与到达系统的路由相同。

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

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

关于C套接字编程: binding with getaddrinfo() and get device IP server is available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com