本节介绍客户机进程所执行的步骤。与在服务器中相同,第一步是查找远程登录的服务定义。
bzero(&hints, sizeof (hints));
hints.ai_flags = AI_ALL|AI_ADDRCONFIG;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(hostname, servicename, &hints, &res);
if (error != 0) {
(void) fprintf(stderr, "getaddrinfo: %s for host %s service %s\n",
gai_strerror(error), hostname, servicename);
return (-1);
}
getaddrinfo(3SOCKET) 返回 res 中的地址列表头。通过创建套接字,并尝试连接列表中返回的每个地址直到一个地址有效,即可找到所需的地址。
for (aip = res; aip != NULL; aip = aip->ai_next) {
/*
* Open socket. The address type depends on what
* getaddrinfo() gave us.
*/
sock = socket(aip->ai_family, aip->ai_socktype,
aip->ai_protocol);
if (sock == -1) {
perror("socket");
freeaddrinfo(res);
return (-1);
}
/* Connect to the host. */
if (connect(sock, aip->ai_addr, aip->ai_addrlen) == -1) {
perror("connect");
(void) close(sock);
sock = -1;
continue;
}
break;
}
套接字已经创建并已连接到所需的服务。connect(3SOCKET) 例程隐式绑定 sock,因为 sock 未绑定。