[C++] 158 HTTPプロトコル リクエスト送信

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

引き続き『C言語によるTCP/IPネットワークプログラミング』のサンプルコード読解です。

サンプルコードは手持ちのコードをつないで動いたものを載せている感が強いので、こちらで勝手にリファクタリングしていきます。

2001年に最前線の技術について著していることに価値があるのであって、単にコードを洗練させるというのは誰にでもできます。

前回記事にしたSOCprintf関数は廃止して、DoHttpGet関数内に移しました。

サンプルコードのような例外処理はあまり考えずに書きました。

// HTTP取得
int DoHttpGet(const char *host, const char *path)
{
	int	soc;
	const char *ptr;
	char request_char[4096];

	fprintf(stderr,"host = %s,path = %s\n", host, path);

	// ホストのHTTPに接続 
	if((soc = ConnectHost(host,"http",80)) == -1){
		fprintf(stderr,"Cannot connect to %s http.\n",host);
		return -1;
	}

	// リクエスト送信(旧SOCprintf関数)
	string request = "GET ";
	request += string(path);
	request += " HTTP/1.0\r\n\r\n";
	
	cout << "request " << request << endl;
	request.copy(request_char, 4095);

	send(soc, request_char, strlen(request_char), 0);
	
	// データ受信 
	if((ptr = strrchr(path,'/'))!=NULL){
		if(strlen(ptr+1)==0){
			SOCrecvDataToFile(soc,"noname");
		}
		else{
			SOCrecvDataToFile(soc,ptr+1);
		}
	}
	else{
		SOCrecvDataToFile(soc,path);
	}

	// ソケットクローズ 
	SocketClose(soc);

	return(0);
}