/* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */ #include <sys/socket.h> /* For gethostbyname */ #include <netdb.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { if(argc != 2) { printf("parameter error!\n"); return -1; } char query[1024]; memset(query, 0x00,sizeof(query)); snprintf(query, sizeof(query), "GET / HTTP/1.0\r\n" "%s\r\n" "\r\n", argv[1]); printf("query = %s\n",query); char hostname[128]; memset(hostname, 0x00,sizeof(hostname)); strcpy(hostname, argv[1]); struct sockaddr_in sin; struct hostent *h; const char *cp; int fd; ssize_t n_written, remaining; char buf[1024]; /* Look up the IP address for the hostname. Watch out; this isn't threadsafe on most platforms. */ h = gethostbyname(hostname); if (!h) { fprintf(stderr, "Couldn't lookup %s: %s", hostname, hstrerror(h_errno)); return 1; } if (h->h_addrtype != AF_INET) { fprintf(stderr, "No ipv6 support, sorry."); return 1; } /* Write the query. */ /* XXX Can send succeed partially? */ cp = query; remaining = strlen(query); fd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in srvaddr; srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(80); char ip[128]; memset(ip, 0x00,sizeof(ip)); inet_ntop(h->h_addrtype, *(h->h_addr_list), ip, sizeof(ip)); printf("ip = %s\n",ip); srvaddr.sin_addr.s_addr = inet_addr(ip); //srvaddr.sin_addr = *(struct in_addr*)h->h_addr; if (connect(fd, (struct sockaddr*) (&srvaddr), sizeof(srvaddr)) < 0) { perror("fun socket:"); exit(0); } while (remaining) { n_written = send(fd, cp, remaining, 0); if (n_written <= 0) { perror("send"); return 1; } remaining -= n_written; cp += n_written; } /* Get an answer back. */ while (1) { ssize_t result = recv(fd, buf, sizeof(buf), 0); if (result == 0) { break; } else if (result < 0) { perror("recv"); close(fd); return 1; } fwrite(buf, 1, result, stdout); } close(fd); return 0; }
