Head First C ―頭とからだで覚えるCの基本
(オライリージャパン)
David Griffiths (著) Dawn Griffiths (著)
中田 秀基(監訳)(翻訳) 木下 哲也 (翻訳)
開発環境
- OS X Yosemite - Apple (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- LLVM/Clang (コンパイラ, Xcode - Apple)
Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の11章(ソケットとネットワーキング: 127.0.0.1という場所はない)、コードマグネット(p.494)を解いてみる。
その他参考書籍
- 21st Century C: C Tips from the New School
- プログラミング言語C 第2版 ANSI規格準拠(B.W. カーニハンD.M. リッチー(著)、石田 晴久(翻訳)、共立出版)
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
- C実践プログラミング 第3版(Steve Oualline(著)、望月 康司 (監訳)(翻訳)、谷口 功(翻訳)、 オライリージャパン)
コードマグネット(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 コメント:
コメントを投稿