#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*/ }