본문 바로가기

공부/컴퓨터

소켓을 이용한 간단한 HTTP 클라이언트

반응형
물론 버그 있음 ^_^;;







001: /* http://img.yahoo.co.kr/home/img/v2.gif */
002:
003: #include <stdio.h>
004: #include <stdlib.h>
005: #include <string.h>
006: #include <winsock2.h>
007:
008: void ErrorHandling(char *message);
009:
010: int main(int argc, char **argv)
011: {
012: WSADATA wsaData;
013: SOCKET hSocket;
014: FILE *fp;
015: FILE *fp2;
016: struct hostent *h;
017: char *file;
018: char *t;
019: char *domain;
020: char argv1_data[100] = {0, };
021: char file_name[100] = { 0, };
022: char query[100] = { 0, };
023: int strLen;
024: int i = 0;
025: int rd;
026:
027: SOCKADDR_IN servAddr;
028:
029: if(argc != 3) {
030: printf("Usage : %s <IP> <PORT>
"
, argv[0]);
031: exit(1);
032: }
033:
034: strcat(argv1_data, argv[1]);
035:
036: t = strtok(argv[1], "//");
037: if ( t != NULL )
038: {
039: t = strtok(NULL,"/");
040: }
041: else
042: {
043: t = strtok(argv[1] , "/" );
044: }
045:
046: domain = t;
047:
048: do
049: {
050: t = strtok(NULL , "/" );
051: if (t != NULL ) file = t;
052: } while ( t != NULL ) ;
053:
054: if ( file == "" ) {
055: printf("화일명이 잘못되었습니다.
"
);
056: exit(1);
057: }
058:
059: strcat(file_name, file);
060: printf("File Name %s
"
, file_name);
061: printf("Domain Name %s
"
, domain);
062:
063:
064: /* Load WinSocket 2.2 DLL */
065: if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
066: ErrorHandling("WSAStartup() error!");
067:
068: /* 서버 접속을 위한 소켓 생성 */
069: hSocket=socket(PF_INET, SOCK_STREAM, 0);
070: if(hSocket==INVALID_SOCKET)
071: ErrorHandling("hSocketet() error");
072:
073: h = gethostbyname(domain);
074: if(!h) ErrorHandling("gethost... error");
075:
076: printf("Host name %s
"
, h->h_name);
077: printf("IP Address %s
"
, inet_ntoa( *(IN_ADDR*)h->h_addr_list[0] ));
078: domain = inet_ntoa( *(IN_ADDR*)h->h_addr_list[0] );
079:
080: memset(&servAddr, 0, sizeof(servAddr));
081: servAddr.sin_family=AF_INET;
082: servAddr.sin_addr.s_addr=inet_addr(domain);
083: servAddr.sin_port=htons(atoi(argv[2]));
084:
085: if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR) /* 서버로 연결 요청 */
086: ErrorHandling("connect() error!");
087:
088:
089: /* 데이터 수신 */
090: printf("연결되었습니다.
"
);
091:
092: strcat(query, "GET ");
093:
094: t = strtok(argv1_data, "//");
095:
096: if ( t != NULL ) {
097: t = strtok(NULL,"/");
098: } else {
099: t = strtok(argv1_data , "/" );
100: }
101:
102:
103: do
104: {
105: t = strtok(NULL , "/" );
106: if (t != NULL ) {
107: strcat(query,"/");
108: strcat(query, t);
109: }
110: } while ( t != NULL ) ;
111: strcat(query,"

"
);
112: printf("QUERY %s", query);
113:
114: // 서버로 쿼리를 날리도록 하자.

115: send(hSocket,query, strlen(query),MSG_OOB);
116:
117:
118: // 서버에서 도착하는 데이터를 읽어서 화면에 출력하도록 하자.

119: while ( recv(hSocket,&rd,1,0) > 0 )
120: {
121: printf("%c",rd);
122: }
123:
124: closesocket(hSocket); /* 연결 종료 */
125: WSACleanup();
126: return 0;
127: }
128:
129: void ErrorHandling(char *message)
130: {
131: fputs(message, stderr);
132: fputc('
'
, stderr);
133: exit(1);
134: }
135:




반응형