- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用(正如我读到的“现代”方法)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它可以从客户端程序连接吗?
最佳答案
您无法确定,因为任何系统都可以有多个具有不同网络和地址的接口(interface)。即使返回的路由也不必与到达系统的路由相同。
此外,由于客户端和服务器之间的任何位置都存在 NAT,客户端可能必须连接到不同的地址和端口。
您可以使用 IP_PKTINFO 套接字选项从 recvmsg 获取地址,以查看消息发往哪个地址,但同样,这可能已在网络级别进行转换。
关于C套接字编程: binding with getaddrinfo() and get device IP server is available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101350/
我目前正在升级我们的软件以支持 ipv6,同时我正在将主机名/ip 字段扩展到最大主机名大小。在 sun 文档中,它似乎可以达到 1025(netdb.h:#define NI_MAXHOST 102
我正在使用 docker-compose 为开发人员提供技术栈 ROR、postgres、redis、mongo 的开发环境。 docker-compose build 运行成功,但是当我运行 doc
nc -zv cms-01 5061 失败: nc: getaddrinfo: 没有与主机名关联的地址 但是 ping/dig 工作正常。用getent可以看到最不一样的地方: # getent ho
我正在测试一条错误路径,该路径要求我删除来自 getaddrinfo 的请求。我设置了 2 个虚拟机: RHEL 7.9 Ubuntu 20 代码在两台机器上是相同的,只是为 test.com 调用
当我调用 getaddrinfo与 AF_UNSPEC ,理论上它可以返回任何它喜欢的地址族:AF_INET , AF_INET6 ,也许是 AppleTalk、蓝牙、datalink、netlink
我花了几个小时试图找出我的问题,只是在我写问题的时候找到了解决方案(当你需要正式化你的问题并解释它时,它总是有帮助的)。我发布它,希望它可以帮助某人。 使用 getaddrinfo,如果我尝试将套接字
我尝试通过给 getaddrinfo 赋予 http(s) 前缀来使用它,但它无法正确查找主机。我该如何解决这个问题。我要查 https://www.google.com但 gai_strerror(
我想在我的 header 中定义一个端口号(例如 #define port 9191 )并使用它来调用 getaddrinfo() 。但我收到错误,因为参数服务是 char const* 。如何使用#
我对 getaddrinfo() 的行为有疑问,这似乎取决于服务参数的指定方式。将服务指定为名称会导致 getaddrinfo() 使用 getservbyname() 来查询/etc/service
我有一个程序(用 C 语言编写),它使用 getaddrinfo() ,它的第一个参数是我希望它获取地址信息的主机名,假设它是“域”。在同一台计算机上的 /etc/hosts 文件中,我可以看到“do
int print_socket_info(int sock_fd, struct sockaddr_in *sin, short protocol){ char dbg[INET_ADDRS
这个问题已经存在: Login and Registration in Android with PHP, MySQL and SQLite 已关闭 7 年前。 我正在尝试连接到我的 mysql wa
我想连接sql数据库。我究竟做错了什么?请帮忙 常量.php 连接.php 最佳答案 首先,您的 constants.php 文件似乎在开始的 PHP 标记中有错字。您应该按如下方式更新文件:
我目前正在尝试编写自己的 HTTP 代理。我的代码可以正常工作,但我尝试使用 ApacheBench 对其进行压力测试,发现时不时地收到如下消息: “getaddrinfo:提供了节点名或服务名,或者
我正在使用 getaddrinfo() API 来解析跨平台 C++ 应用程序中的 DNS 查询。我需要知道 getaddrinfo() 在不同平台上的时间成本?谁能帮我解决这个问题? 最佳答案 这个
我有一个使用套接字的程序。在客户端,我通过 getaddrinfo 获取必要的信息,然后将结果传递给连接函数。事情是,它在不同的环境中工作不同。在获取 addrinfo 结构并将其传递给 connec
我有一个网络地址,例如 - 192.168.74.0/24。尝试使用 getaddrinfo 获取网络地址转换似乎不起作用。这里的名称是 192.168.74.0/24。 getaddrindo 的返
所以我花了一段时间才弄明白,因为“段错误”没有显示任何代码行,但显然这会导致我的程序出现段错误: if (getaddrinfo(options.servername, (char *)options
我遇到了一个奇怪的问题。我有这个 Python 应用程序,当我尝试在应用程序中打开 url 时,例如 urllib2.urlopen("http://google.com", None) 我收到以下错
我在 LAN 中用于某些套接字通信应用程序的目标机器具有用于 IPv4 的 192.168.98.91。 当我尝试使用 getaddrinfo() 解析 IP 地址时,它返回 127.0.0.1 如何
我是一名优秀的程序员,十分优秀!