プログラミングインタフェース

ソケットとクライアント

この節では、クライアントリモートログインプロセスで行われる処理について説明します。サーバー側と同様に、まずリモートログインのサービス定義の位置を確認します。

    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) {
		/*
		 * ソケットを開く。アドレスタイプは、提供される
		 * getaddrinfo() によって変わる。
		 */
		sock = socket(aip->ai_family, aip->ai_socktype,
		    aip->ai_protocol);
		if (sock == -1) {
			perror("socket");
			freeaddrinfo(res);
			return (-1);
		}

		/* ホストに接続する */
		if (connect(sock, aip->ai_addr, aip->ai_addrlen) == -1) {
			perror("connect");
			(void) close(sock);
			sock = -1;
			continue;
		}
		break;
	}

ソケットが作成され、希望のサービスに接続されます。sock はバインド解除されているので、connect(3SOCKET) ルーチンは暗黙的に sock をバインドします。