Programming Interfaces Guide

Sockets and Clients

This section describes the steps taken by a client process. As in the server, the first step is to locate the service definition for a remote login.

    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) returns the head of a list of addresses in res. The desired address is found by creating a socket and trying to connect to each address returned in the list until one works.

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;
	}

The socket has been created and has been connected to the desired service. The connect(3SOCKET) routine implicitly binds sock, because sock is unbound.