ふつうの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サーバーを作る」めっちゃ楽しみです!!