由于我之前的问题没有答案,因此我将其重述。
使用PC名称(NetBIOS名称)执行gethostbyname()时,使用什么顺序的IP地址(如果将IP地址绑定到一个接口)?
我有以下代码:
#include <iostream>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{
char hostname[255];
struct hostent *he;
struct in_addr **addr_list;
WSAData data;
WSAStartup(MAKEWORD(2, 2), &data);
gethostname(hostname, 255);
std::cout << "Host name: " << hostname << std::endl;
if ((he = gethostbyname(hostname)) == NULL) {
std::cout << "gethostbyname error" << std::endl;
} else {
std::cout << "IP addresses: " << std::endl;
addr_list = (struct in_addr **)he->h_addr_list;
for(int i = 0; addr_list[i] != NULL; i++) {
std::cout << inet_ntoa(*addr_list[i]) << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 我花了几个小时试图找出我的问题,只是在我写问题的时候找到了解决方案(当你需要正式化你的问题并解释它时,它总是有帮助的)。我发布它,希望它可以帮助某人。
使用 getaddrinfo,如果我尝试将套接字连接到我的服务器,执行(我认为是)在大量网站以及 getaddrinfo 的手册页示例代码中解释的内容,它会因“连接超时”而失败错误信息:(简化代码更简洁)
void connect_UsingGetAddrInfo_Wrong (std::string host, unsigned short int port, int& socketfd)
{
//simplified loops & error handling for concision
int x;
int domain = AF_INET; // IP_v4
int socketType = SOCK_STREAM; // Sequenced, reliable, connection-based byte streams.
addrinfo hints, *addr;
//fine-tune hints according to which socket you want to open
hints.ai_family = domain;
hints.ai_socktype = socketType;
hints.ai_protocol = 0; // no enum : possible value can be read in /etc/protocols
hints.ai_flags = AI_CANONNAME | AI_ALL | …Run Code Online (Sandbox Code Playgroud) 我正在学习C 和TCP/UDP。正如标题... C 中的 inet_aton() 和 gethostbyname() 有什么区别吗?据我所知,两者都将 IP 地址从字符串转换为数字。
我通过不同线程的 gethostbyname() 进行了 DNS 解析实验。我关闭了网络链接并运行了下面的程序。输出是这样的
gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 完成于 1411234774 gethostbyname 完成于 1411234814 gethostbyname 完成于 1411234854
gethostbyname() 同时开始,但在 40 秒超时后一一完成。
然后我尝试了 getaddrinfo()。看起来这个函数没有遇到这个问题
getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799
那么,为什么我得到这个结果,这种行为是否仅针对 Linux?
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
void *resolve_ghbn(void *host) {
printf("gethostbyname started at %d\n", time(NULL));
struct hostent *rslv = gethostbyname((char*)host);
printf("gethostbyname finished at %d\n", time(NULL)); …Run Code Online (Sandbox Code Playgroud) 我需要通过域名获取域的IP地址.
可以这样做,在那种情况下,我该怎么做?