#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> #define DEFAULT_PORT "8000" enum {CMD_NAME, DST_IP, DST_PORT}; 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]; char ip[256]; /* 引数の数をチェック */ if (argc < 2) { fprintf(stderr, "usage: %s host (port)\n",argv[0]); exit(EXIT_FAILURE); } /* アドレスをバイナリに変換 */ 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*/ } if (res->ai_family == AF_INET6) printf("connected to '%s' by IPv6\n", inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)(res->ai_addr))->sin6_addr),ip, 256)); else if (res->ai_family == AF_INET) printf("connected to '%s' by IPv4\n", inet_ntop(AF_INET, &(((struct sockaddr_in *)(res->ai_addr))->sin_addr), ip, 256)); else printf("connected by no IPv4/IPv6.\n"); s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (s < 0) { perror("socket"); exit(EXIT_FAILURE); } 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, (argc==3)?argv[DST_PORT]:DEFAULT_PORT); if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { perror("connect"); exit(EXIT_FAILURE); } /*send adress for saerver*/ while ((l = read(s, buf, sizeof(buf))) > 0) write(STDOUT_FILENO, buf, l); close(s); exit(0); /*NOTREACHED*/ }