2015年1月11日日曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の11章(ソケットとネットワーキング: 127.0.0.1という場所はない)、コードマグネット(p.494)を解いてみる。

その他参考書籍

コードマグネット(p.494)

コード(BBEdit, Emacs)

sample494.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>

#include <stopif.h>

#include "say.c"

int open_socket(char *host, char *port) {
  struct addrinfo *res;
  struct addrinfo hints;
  memset(&hints, 0, sizeof(hints));
  hints.ai_family = PF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  Stopif(getaddrinfo(host, port, &hints, &res) == -1,
         exit(1),
         "アドレスを解決できません: %s", strerror(errno));
  int d_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  Stopif(d_sock == -1, exit(1), "ソケットを開けません: %s", strerror(errno));
  int c = connect(d_sock, res->ai_addr, res->ai_addrlen);
  freeaddrinfo(res);
  Stopif(c == -1, exit(1), "ソケットに接続できません: %s", strerror(errno));
  return d_sock;
}

int main(int argc, char **argv) {
  int d_sock = open_socket("en.wikipedia.org", "80");
  char *buf;
  asprintf(&buf, "GET /wiki/%s http/1.1\r\n", argv[1]);
  say(d_sock, buf);
  say(d_sock, "Host: en.wikipedia.org\r\n\r\n");

  char rec[256];
  int bytesRcvd = recv(d_sock, rec, 255, 0);
  while (bytesRcvd) {
    Stopif(bytesRcvd == -1, exit(1),
           "サーバーから読み込めません: %s", strerror(errno));
    rec[bytesRcvd] = '\0';
    printf("%s", rec);
    bytesRcvd = recv(d_sock, rec, 255, 0);
  }
  close(d_sock);
  free(buf);
}

  
  

入出力結果(Terminal)

$ ./sample494 "O'Reilly Media"
HTTP/1.1 200 OK
Server: Apache
省略...
<!DOCTYPE html>
省略...
</html>
$

0 コメント:

コメントを投稿