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