#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++;
}
}