【发布时间】:2014-11-11 12:20:36
【问题描述】:
我正在编写一个简单的 UDP 客户端服务器聊天,以便更熟悉网络编程。现在让用户更容易看到服务器的 IP 地址是什么(以便用户可以将其键入客户端进行连接)。这就是为什么我希望服务器显示自己的本地 IP 地址。
这是我的代码:(处理多个 IP 的编辑代码)
// get the hostname of the server
char hostname[128];
if (gethostname(hostname, sizeof(hostname)) == -1) {
std::cout << "Could not get the hostname of the server. Error: " << std::strerror(errno) << std::endl;
return 1;
}
struct addrinfo hints, *serverInfo, *p;
std::memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // use AF_INET (IPv4) or AF_INET6 (IPv6) to force version
hints.ai_socktype = SOCK_DGRAM;
// try to get information about our hostname
int rv;
if ((rv = getaddrinfo(hostname, NULL, &hints, &serverInfo)) != 0) {
std::cout << "Failed to get information about the host \"" << hostname << "\". Error: " << gai_strerror(rv) << std::endl;
return 1;
}
std::cout << "IP addresses for " << hostname << ":" << std::endl;
// iterate over all the infos we got and try to extract the IP address
for(p = serverInfo; p != NULL; p = p->ai_next) {
char serverIPAddress[INET6_ADDRSTRLEN];
void *addr;
std::string ipVersion;
// get the pointer to the address itself,
// different fields in IPv4 and IPv6:
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
ipVersion = "IPv4";
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
ipVersion = "IPv6";
}
// take the IP address of our hostname and convert it into a readable format
inet_ntop(p->ai_family, addr, serverIPAddress, sizeof(serverIPAddress));
std::cout << " " << ipVersion << ": " << serverIPAddress << std::endl;
}
freeaddrinfo(serverInfo); // free the linked list
它可以工作,但它不显示正确的 IP 地址。每次我运行它时,都会显示一个不同的 IP,而且它不是正确的。正如我所说,我仍在学习网络编程,所以我不知道为什么会这样。有人能指出我正确的方向吗?
【问题讨论】:
标签: c++ sockets unix network-programming