WinSock/外部通信の方法
外部通信の原理
編集基本
編集MSDNのコード(WinSock/MSDNのソケットコードの保管場所)だと、まだローカルホストにしかアクセスできない。
外部アクセスするには、どうすればいいだろうか
getaddrinfo の第一引数にホスト名(www.なんとか)を入力すればいい。
その他、 TCP/IP で通信する場合なら、 sockaddr_in 構造体というのが既にWindowsに用意されており、これの構造体変数に必要な値を代入する方法もある。
sockaddr_in 構造体とはunixソケットプログラミングに由来する用語だが、
winsockにも同名の構造体が存在する。"SOCKADDR_IN structure"
struct sockaddr_in 構造体変数;
memset(&構造体変数, 0, sizeof(struct sockaddr_in));
構造体変数.sin_port = htons(使用するポート番号);
構造体変数.sin_family = AF_INET;
構造体変数.sin_addr.何か = inet_addr("IPアドレス");
HTTPヘッダ
編集上述のsockaddr_in 構造体などの方法でとりあえず、ネット上に公開されている、どのサーバーとも原理的には通信できる。
では、これによって、どうやって、ネットのホームページなどを受け取るのかというと、
実は仕組みは、
特殊なメッセージとして、「HTTPヘッダ」(分野によって多少、名称が違う)などの名前で呼ばれる種類のメッセージを送受信している。(HTTPヘッダの送受信のコマンドは通常のソケットプログラミングのコマンドと同様、send()やrecieve()などで送受信する仕組みである。)
HTTPやTCPなどの規格により、"GET 〇〇"というメッセージを受け取ったらああしろとか、"Host: 〇〇"といううメッセージを受け取ったらああしろ、など
の仕様が色々と規格的に決まっている。
たとえば、もしドキュメントルートに「index.html」というファイルがあって、これの読み取りをHTTPサーバーに行わせたければ、おおむね
GET /index.html HTTP/1.1 Host: localhost
というメッセージをクライアント側からサーバーに送信( send()関数 )する事になる[1]。
そして、規格にある命令を受け取ったサーバーは、その命令に応じて、サーバー側が管理下のファイルなどを読み取って、読み取った結果をクライアント側に受け渡す、という仕組みである。
この節の内容はWindowsに限らず、LinuxやBSDなどでも同様の仕組みである(というか、unixなどのソケット通信の仕組みをWindowsも真似た)。
Host の部分は、このGETメッセージを送る際のヘッダです(MINEヘッダと言うものです)。
クライアント側は、けっして直接には、htmlファイルそのもには接続していない。あくまでサーバー側が、メッセージで要求されたhtmlファイルを探してきて、それを読み取って、内容をクライアントに送り返すという仕組みである。
事前のテストなどで、webブラウザでサーバーにアップロードした index.html を見ると
http://localhost/index.html
のような英字がブラウザのアドレス欄に表示されるので、あたかもクライアント側が「loacalhost」にある「index.html」というファイルに(勘違いだが)直接に接続しているかのように錯覚しがちであるが、しかし実態ではクライアント側は localhostサーバーの送受信の窓口以外には何も接続していない。
この場合にクライアント側が接続しているのは、localhostの送受信窓口だけである。
- HTMLパーサ
なお、ブラウザが画面に文字や画像を表示できたりするのは、送られてきたテキスト本文(HTMLコード)や画像などのバイナリデータといった文字列を、ブラウザ側で解釈して、 文章や画像などに変換しているからである。これはソケットプログラムの範囲を超えるので、説明しない。また、それらの変換をするソフトウェアも、ソケット通信ではなく、アプリであるブラウザ側でそういった画像や文章などへの変換を行っている。
なお、そのようなHTMLを読み取るソフトウェアのことはHTMLパーサ(HTML解釈機)という。一般的なwebブラウザには、アプリ内部にHTMLパーサが入っている。
おおまかには、もしwebブラウザをイチから作るとしたら、HTTPヘッダの送受信の機能の自作と、HTMLパーサを自作すれば、とりあえずはwebブラウザのようなモノを作れるだろう。(実際には規格としては明文化されてないような、細かい仕様もあるだろうから、ブラウザ自作はオススメできないが。)
具体的なコード
編集HTTP通信で具体的にApache(アパッチ)などのHTTPサーバと接続するソケット通信コードの具体例およびコードサンプルについては 単元『WinSock/HTTP通信』 で説明およびコード掲載してある。
参考文献
編集- ^ 村山公保『基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版』オーム社、257ページ、平成30年9月10日 第3版 第5刷 発行