/* ace_httpc.cpp * Simple HTTP Client using ACE * * HTTPサーバからファイルを転送してもらい、標準出力に印字するプログラム。 * * 実行方法: * > プログラム名 [ファイル名(ルートからのフルパス、UNIX形式)] [サーバアドレス] */ #include <ace/INET_Addr.h> #include <ace/SOCK_Connector.h> #include <ace/SOCK_Stream.h> #include <string> int main(int argc, char *argv[]) { // 第一引数はGETしてくるファイル名(ルートからのフルパス)。デフォルトは /index.html std::string pathname(argc > 1 ? argv[1] : "/index.html"); // 第二引数はHTTPサーバのアドレス。デフォルトは何故かYAHOO!Japan(^^; std::string server_hostname(argc > 2 ? argv[2] : "www.yahoo.co.jp"); ACE_SOCK_Connector connector; ACE_SOCK_Stream peer; ACE_INET_Addr peer_addr; // ポート番号とサーバアドレスを与えてアドレスクラスを初期化 if (peer_addr.set(80, server_hostname.c_str()) == -1) return 1; // サーバに接続 if (connector.connect(peer, peer_addr) == -1) return 1; // HTTP/1.0の仕様に従ってGETリクエストを発行 // 仕様はRTF1945(http://www.ietf.org/rtf/1945.txt) std::string message = "GET " + pathname + " HTTP/1.0\r\n\r\n"; if (peer.send_n(message.c_str(), message.length()) == -1) return 1; // サーバからの出力を受け取り標準出力に印字 char buf[BUFSIZ]; for (ssize_t n; (n = peer.recv(buf, sizeof(buf))) > 0;) ACE::write_n(ACE_STDOUT, buf, n); // ソケットをクローズ return peer.close() == -1 ? 1 : 0; }