[C++] 159 HTTPプロトコル ソケット接続

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

『C言語によるTCP/IPネットワークプログラミング』のサンプルコード読解の続きです。前回のリクエスト送信と順序が逆になってしまいました。

ドメイン名からIPアドレスを取得しソケット接続するConnectHost関数について調べました。コード的に特にいじるところはありませんでした。

// ソケット接続 
int ConnectHost(const char *host,const char *port,int portno)
{
	struct hostent	*servhost;    // ホスト名
	struct servent	*service;     // サービス名
	struct sockaddr_in	sockaddr; // IPアドレス・ポート番号保管
	int	soc;
	int p;

	// ホスト名取得
	if((servhost = gethostbyname(host)) == NULL){ // ホスト名がない場合
		u_long addr;
		addr = inet_addr(host);

		servhost = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
		if (servhost == NULL) {
			perror("Error:gethostbyaddr");
			return(-1);
		}
	}

	// サービス名取得
	if((service = getservbyname(port,"tcp")) == NULL){
	}

	// ソケット作成
	if((soc = socket(AF_INET,SOCK_STREAM,0)) < 0){
		perror("socket");
		return(-1);
	}

	// sockaddr作成
	memset((char *) &sockaddr, 0, sizeof(sockaddr));
	sockaddr.sin_family = AF_INET; // アドレスファミリー

	cout << "sockaddrのサイズ(unsigned long) " << sizeof(sockaddr) << endl;

	if(service == NULL){
		if((p = atoi(port)) == 0){
			p = portno;
		}
		sockaddr.sin_port = p;
	} else {
		sockaddr.sin_port = service -> s_port; // ポート番号取得
	}

	// IPアドレスをコピー
	memcpy((char *)&sockaddr.sin_addr,servhost->h_addr,servhost->h_length);

	// servhostアドレスリスト・メモリ番地(このコードでは不要)
	cout << "servhost->h_addr_list " << servhost->h_addr_list << endl;

	// sockaddr・メモリ番地
	cout << "&sockaddr " << &sockaddr << endl;

	// IPアドレス・メモリ番地
	cout << "&sockaddr.sin_addr " << &sockaddr.sin_addr << endl;

	// ソケット接続(ソケット記述子・IPアドレス・ポート番号が必要)
	if(connect(soc,(struct sockaddr *)&sockaddr,sizeof(sockaddr))==-1){
		perror("connect");
		SocketClose(soc);
		return(-1);
	}
	return(soc);
}
host = localhost,path = /index.html
sockaddrのサイズ(unsigned long) 16
servhost->h_addr_list 0x11f8040da
&sockaddr 0x16b681fb8
&sockaddr.sin_addr 0x16b681fbc
request GET /index.html HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 24 Aug 2022 13:36:26 GMT
Server: Apache/2.4.46 (Unix) OpenSSL/1.0.2u PHP/7.4.21 mod_wsgi/3.5 Python/2.7.18 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.30.1
Last-Modified: Tue, 23 Aug 2022 16:04:38 GMT
ETag: "78-5e6eab8a35180"
Accept-Ranges: bytes
Content-Length: 120
Connection: close
Content-Type: text/html