この節では、クライアントリモートログインプロセスで行われる処理について説明します。サーバー側と同様に、まずリモートログインのサービス定義の位置を確認します。
sp = getservbyname("login", "tcp"); if (sp == (struct servent *) NULL) { fprintf(stderr,"rlogin: tcp/login: unknown service"); exit(1); }
次に、getipnodebyname(3SOCKET) 呼び出しで宛先ホストを調べます。
hp = getipnodebyname (AF_INET6, argv[1], AI_DEFAULT, &errnum); if (hp == (struct hostent *) NULL) { fprintf(stderr, "rlogin: %s: unknown host", argv[1]); exit(2); }
次に、要求されたホストでサーバーに接続し、リモートログインプロトコルを開始します。アドレスバッファーはクリアされ、外部ホストのインターネットアドレスと、ログインサーバーが待機するポート番号が書き込まれます。
memset((char *) &server, 0, sizeof server); bzero (&sin6, sizeof (sin6)); memcpy((char*) &server.sin6_addr,hp->h_addr,hp->h_length); server.sin6_family = hp->h_addrtype; server.sin6_port = sp->s_port;
ソケットが作成され、接続が開始されます。s のバインドが解除されるため、connect(3SOCKET) は暗黙に bind(3SOCKET) を実行します。
s = socket(hp->h_addrtype, SOCK_STREAM, 0); if (s < 0) { perror("rlogin: socket"); exit(3); } ... if (connect(s, (struct sockaddr *) &server, sizeof server) < 0) { perror("rlogin: connect"); exit(4); }