【发布时间】:2016-06-30 20:21:56
【问题描述】:
我使用一个库来做一些网络工作,当客户端连接时,这个库提供了一个“struct sockaddr *”来保存客户端套接字。我只是想提取 IP 和端口,我目前这样做:
#include <sys/socket.h>
#include <netdb.h>
const std::string Client::prepareIPandPort(struct sockaddr *hostaddr) {
assert(hostaddr != nullptr);
std::string ipport;
char clienthost[NI_MAXHOST];
char clientport[NI_MAXSERV];
int result = getnameinfo(hostaddr, sizeof(*hostaddr),
clienthost, sizeof(clienthost),
clientport, sizeof(clientport),
NI_NUMERICHOST | NI_NUMERICSERV);
if (result != 0) {
std::cerr << "Error: " << gai_strerror(result) << std::endl;
ipport = "unknown";
} else {
switch (hostaddr->sa_family) {
case AF_INET:
ipport = std::string {clienthost} + ":"
+ std::string {clientport};
break;
case AF_INET6:
ipport = "[" + std::string {clienthost} + "]:"
+ std::string {clientport};
break;
default:
ipport = "unknown";
}
}
return ipport;
}
在我的 Mac 上使用 IPv4 时,它可以工作。如果我在完全支持 IPv6 的 Gentoo Linux 服务器上使用这个应用程序,我只会得到:
错误:不支持 ai_family
连接的客户端有 AAAA 和 IP6 记录。
我添加了一些 couts 并打印了 hostaddr->sa_family,它返回 10,即 AF_INET6。
为什么这不起作用? :-)
【问题讨论】:
标签: c++ c sockets networking