ふつうのLinuxプログラミング 第13章〜第15章 いよいよネットワーク!!
さて、いよいよ後半戦。第3部!!Linuxネットワークプログラミング!!
まずは、daytimeクライアント。サーバーの時計が見れるらしい。
っていきなりむじぃし・・・サンプルにヘッダ書いてないし・・・。仕方ないので、manを叩きまくり、Vimの補完で楽をしつつ、GDBで様子を見ながら進めます。
アレ?ネットワークに継らない。サーバー設定が悪いらしい。telnetでも継らない。Fedora Core ビギナーズバイブルに設定が書いてあったので、そのままやってみたけど、継らず。
% telnet localhost daytime Trying ::1... telnet: connect to address ::1: Connection refused telnet: Unable to connect to remote host: Connection refused
localhostでは名前が解決しなかったので、127.0.0.1にした。
% telnet 127.0.0.1 daytime Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. 30 MAR 2007 13:42:25 JST Connection closed by foreign host.
きた!!コーディングを進める。
嬉しくなったので、今日はソースつき。aiのリンクリストが難解だった。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> static int open_connection(char *host, char *service); int main(int argc, char *argv[]) { int sock; FILE *f; char buf[1024]; sock = open_connection(argc > 1 ? argv[1] : "localhost", "daytime"); f = fdopen(sock, "r"); if (!f) { perror("fdopen(3)"); exit(EXIT_FAILURE); } fgets(buf, sizeof(buf), f); fclose(f); fputs(buf,stdout); exit(EXIT_SUCCESS); } static int open_connection(char *host, char *service) { int sock; struct addrinfo hints, *res, *ai; // ai : Address Info int err; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((err = getaddrinfo(host, service, &hints, &res)) != 0) { fprintf(stderr, "getaddrinfo(3):%s)", gai_strerror(err)); exit(EXIT_FAILURE); } // ai_next : linked list for (ai = res; ai; ai = ai->ai_next ) { sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sock < 0) continue; if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0) { close(sock); continue; } freeaddrinfo(res); return sock; } fprintf(stderr,"socket(2)/connect(2) failed"); freeaddrinfo(res); exit(EXIT_FAILURE); }
では・・・いよいよ・・・make!
% make % ./daytime 127.0.0.1 30 MAR 2007 13:50:54 JST
うっほぉ!!サーバーに継った!!
次は・・・「HTTPサーバーを作る」めっちゃ楽しみです!!