대학 생활/C
[C] HTTP client 예제
opid
2014. 11. 5. 10:20
#include <WinSock2.h> #include <stdio.h> #define BUFMAX 1024 #define GET_MSG "GET /index.html HTTP/1.0\n\n" #define PORT 80 void printIPAddrs(char **h_addr_list); // A. 실행인자로 도메인 이름을 받는다. int main(int argc, char **argv) { WSADATA WSAData; struct hostent *myent; SOCKADDR_IN addr; SOCKET s; char buffer[BUFMAX]; int readbytes = 0; // B. 인터넷 주소를 가져오지 못할 경우 에러 처리. if(argc != 2) { printf("Usage : %s [ineternet address]\n", argv[0]); WSACleanup(); return 1; } if (WSAStartup (MAKEWORD(2,2), &WSAData) != 0) { printf("WSAStartup failed\n"); return 1; } myent = gethostbyname(argv[1]); if(myent == NULL) { printf("Not Found Domain Name.\n"); return; } printf("Host Name : %s\n", myent->h_name); printIPAddrs(myent->h_addr_list); printf("=====================================================\n"); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == INVALID_SOCKET) { return 1; } addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.S_un.S_addr = inet_addr(inet_ntoa(*(struct in_addr *)*myent->h_addr_list)); printf("%s %d\n", inet_ntoa(*(struct in_addr *)*myent->h_addr_list), PORT); printf("%s\n", GET_MSG); printf("=====================================================\n"); // D. 인터넷 주소 중 하나를 선택해서 웹 서버에 연결해서 웹페이지를 요청한다.(HTTP 프로토콜의 GET Method 이용) if(connect(s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) { printf("fail to connect\n"); closesocket(s); return 1; } send(s, GET_MSG, sizeof(GET_MSG), 0); while(1){ int i = 0; ZeroMemory(buffer, BUFMAX); i = recv(s, buffer, BUFMAX, 0); if(i <= 0) { break; } readbytes += i; printf("%s", buffer); } printf("\ntotal length : %d\n", readbytes); closesocket(s); WSACleanup(); return 0; } // C. 여러 개의 인터넷 주소가 있을 때, 이를 모두 출력한다. void printIPAddrs(char **h_addr_list) { while(*h_addr_list != NULL) { printf("%s\n", inet_ntoa(*(struct in_addr *)*h_addr_list)); h_addr_list++; } }