阅读本书时<计算机系统:程序员的视角>在《网络编程》一章中,我看到了一个这样的函数:
int open_clientfd(char *hostname, char *port) {
int clientfd;
struct addrinfo hints, *listp, *p;
/* Get a list of potential server addresses */
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_socktype = SOCK_STREAM; /* Open a connection */
hints.ai_flags = AI_NUMERICSERV; /* ... using a numeric port arg. */
hints.ai_flags |= AI_ADDRCONFIG; /* Recommended for connections */
Getaddrinfo(hostname, port, &hints, &listp);
/* Walk the list for one that we can successfully connect to */
for (p = listp; p; p = p->ai_next) {
/* Create the socket descriptor */
if ((clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0)
continue; /* Socket failed, try the next */
if (connect(clientfd, p->ai_addr, p->ai_addrlen) != -1)
break; /* Success */
Close(clientfd); /* Connect failed, try another */
}
/* Clean up */
Freeaddrinfo(listp);
if (!p) /* All connects failed */
return -1;
else /* The last connect succeeded */
return clientfd
}
在这个功能中,书中说";open_clientfd函数建立与在主机主机名上运行并侦听端口号端口上的连接请求的服务器的连接;
因此,我理解主机名是客户端的,端口是客户端-服务器事务的服务器。
我的疑虑来自代码Getaddrinfo(主机名、端口、提示和列表(;
由于getaddrinfo的主机和服务参数是套接字地址的两个组成部分(正如书中所说(,我认为这个open_clientfd函数只有在客户端和服务器位于同一主机上时才能工作。
我说得对吗?我怎么了?
您对host
和port
意义的理解不正确。
服务器运行特定的主机和特定的端口。因此host
与port
的组合标识单个服务器。
Getaddrinfo
返回一个要尝试的(ip,port(组合列表,如果需要,可以使用DNS将主机名转换为ip地址列表。然后,函数会尝试将它们逐一连接,直到成功为止。
无论服务器运行在哪里,它都能正常工作。