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


+ Recent posts