#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main __P((int, char **));

int
main(argc, argv)
int argc;
char **argv;
{
	struct addrinfo info, *res; /* アドレス情報 */
	ssize_t l;
	int s;
	char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
	char buf[1024];

	/* 引数の数をチェック */
	if (argc != 3) {
		fprintf(stderr, "usage: %s host port\n",argv[0]);
		exit(1);
		/*NOTREACHED*/
	}

	/* アドレスをバイナリに変換 */
	memset(&info, 0, sizeof(info));
	info.ai_flags    = AI_CANONNAME;
	info.ai_family   = AF_UNSPEC;
	info.ai_socktype = SOCK_STREAM;
	
	if (getaddrinfo(argv[1], argv[2], &info, &res) != 0) {
		perror("getaddrinfo");
		exit(EXIT_FAILURE);       
	}
	
	if (!res) {
		fprintf(stderr, "%s: %s\n", argv[1], hstrerror(h_errno));
		exit(1);
		/*NOTREACHED*/
	}
	
	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
	if (s < 0) {
		perror("socket");
		exit(1);
		/*NOTREACHED*/
	}
	
	getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);
	fprintf(stderr, "trying %s port %s\n", hbuf, argv[2]);

	if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
		perror("connect");
		exit(1);
		/*NOTREACHED*/
	}
	
	/*send adress for saerver*/
	while ((l = read(s, buf, sizeof(buf))) > 0)
			write(STDOUT_FILENO, buf, l);
	close(s);
	exit(0);
	/*NOTREACHED*/
}