IPv4枯渇時計を設置してみた

IPv4枯渇時計というブログパーツを見つけて、ちょっと前にIPv6の話をしたこともあったので、右のサイドバーに設置してみました。

直線的にアドレスがなくなっていくわけではないので、単純にあと2,3年で枯渇してしまうというわけではないと思いますが、どちらにしろ減って行く一方です。

IPv6への移行は、あと何年後に本格的に始まるのでしょうか。せっかくなので、この前書いた、IPv6対応のHTML取得プログラムでも掲載しておきます。

Windowsの場合は、先頭でUSING_WINSOCKをdefineしてコンパイルしてください。

#include <stdio.h>
#include <string.h>

#ifdef USING_WINSOCK

#include <winsock2.h>
#include <ws2tcpip.h>

#else

#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>

#endif

#define MAX_RECV 65536
#define DEFAULT_REQUEST "GET / HTTP/1.0rnrn"
#define DEFAULT_FAMILY AF_UNSPEC

int main( int argc, char *argv[] ) {
	char *hostname = NULL;
	char *request = DEFAULT_REQUEST;
	int   family   = DEFAULT_FAMILY;

	struct addrinfo hints;
	struct addrinfo *infos;
	int error;

	int s; // ソケット
	int n, tmp; //受信,送信したバイト数
	char receive[MAX_RECV]; //受信したデータを格納する場所
	int i;

#ifdef USING_WINSOCK
	struct WSAData wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif

	// 引数処理
	for ( i = 1; i < argc; i++ ) {
		if ( strcmp(argv[i], "-ipv4") == 0 ) {
			family = AF_INET;
		} else {
			if ( !hostname ) hostname = argv[i];
		}
	}

	// アドレス(ソケット情報)を取得
	memset(&hints, 0, sizeof( struct addrinfo ));
	hints.ai_family = family;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;

	error = getaddrinfo(hostname, "http", &hints, &infos);
	if ( error ) {
		fprintf(stderr, "Failed to getaddinfo.n");
		fprintf(stderr, "%sn", gai_strerror(error));
		return 1;
	}

	// ソケットを作成
	s = socket(infos->ai_family, SOCK_STREAM, 0);
	if ( s == -1 ) {
		fprintf(stderr, "Failed to socket.n");
		freeaddrinfo(infos);
		return 1;
	}

	// サーバーへ接続 (サーバーのソケットへ接続)
	if ( connect(s, infos->ai_addr, infos->ai_addrlen) ) {
		fprintf(stderr, "Failed to connect.n");
		freeaddrinfo(infos);
	}
	freeaddrinfo(infos);

	// HTTPリクエストの送信
	n = 0;
	while ( n < strlen(request) ) {
		tmp = send(s, &request[n], strlen(request) - n, 0);
		if ( tmp == -1 ) {
			fprintf(stderr, "Failed to send.n");
			return 1;
		}
		n += tmp;
	}

	// データを受信
	do {
		n = recv(s, receive, MAX_RECV, 0);
		if ( n == -1 ) {
			fprintf(stderr, "Failed to recv.n");
			return 1;
		}
		printf(receive);
	} while ( n != 0);

#ifdef USING_WINSOCK
	shutdown(s, SD_BOTH);
	closesocket( s );
	WSACleanup();
#else
	shutdown(s, SHUT_RDWR);
	close(s);
#endif

	return 0;
}

コメント投稿