[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