本节介绍客户机进程所执行的步骤。与在服务器中相同,第一步是查找远程登录的服务定义。
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 未绑定。