socket 을 사용하여 web page를 받아올때 버추얼서버의 내용을
글쓴이: qprk / 작성시간: 화, 2003/12/23 - 12:18오후
소켓을 사용하여 html 을 받아올때
일반적으로
telnet www.qprk.pe.kr 80
GET /disp.html HTTP/1.0
이렇게 하면 page를 받아와야 하는데
실제 서버가 아니고 버추얼웹서버라서 해당 page가 없다고 나옵니다.
브라우저에서 http://www.qprk.pe.kr/disp.html 로 하면 해당 page가
보이고 위와 같이 telnet 으로 하면 없다고 합니다.
어떻게 하면 위의 page를 가지고 올 수 있을까요?
아래는 해당 소스 입니다.
/*************************************************************** * url을 할당받아 로봇을 가동 * host = "www.qprk.pe.kr", uri = "/disp.html" ***************************************************************/ int startRobot(char *host, char *uri, char *htmlBuff) { char jobUrl[512]; int sockfd; int i=0; sockfd = HTTPConnect(host); if (sockfd == -1) return -1; Request(sockfd,uri); /* 서버로 부터의 응답 메세지가 없을 경우 */ if((fileSize=Response(sockfd, htmlBuff)) <=0 ) { // printf("No Response From\n"); return -1; } // resetBuff=fileSize; sprintf(jobUrl, "%s%s",host,uri); // printf("\njobUrl -> %s\n\n",jobUrl); parseQprk(jobUrl, htmlBuff); return 1; } /*************************************************************** * host에 접속 ***************************************************************/ int HTTPConnect(char *hostname) { int sleepcnt=0,status; unsigned long IPAddr; struct hostent *hostp; char **addrs; char portBuff[512], *portTemp; int isPort, i; isPort = 0; memset(portBuff, 0, 512); strncpy(portBuff, hostname, 512); // signal(SIGALRM, time_out); bzero((char *)&serverAddress, sizeof(serverAddress)); serverAddress.sin_family = AF_INET; // prot 추출하기 if(strchr(portBuff, ':') != NULL) { for(i=0; portBuff[i] != ':' ; i++) ; portBuff[i]= '\0'; // printf(" 여긴가???,,,%d,,,%c,,,%s\n",i , portBuff[i], &portBuff[i+1]); isPort = atoi(&portBuff[i+1]); } if(isPort) /* 80port 말고 다른거 사용할 경우 */ serverAddress.sin_port = htons(isPort); else serverAddress.sin_port = htons(DEFAULT_PORT); // printf("사용 포트는 ??? %d\n",isPort); /* IP 주소인지 도메인 이름인지 체크한다. */ if((IPAddr = inet_addr(portBuff)) != INADDR_NONE){ bcopy((char *)&IPAddr,(char *)&serverAddress.sin_addr,sizeof(IPAddr)); hostInfo.h_name = NULL; } else { if((hostp = gethostbyname(portBuff)) == NULL){ printf("[<31m!!!!TCP Error[<0m : hostname error %s\n",portBuff); return(-1); } addrs = hostp->h_addr_list; // printf("\t\t\t\t\thost ip = %s\n", inet_ntoa(*(struct in_addr *)*addrs)); hostInfo = *hostp; bcopy(hostp->h_addr, (char *)&serverAddress.sin_addr, hostp->h_length); } // return-1; /* get host by name */ /* 실제로 소켓을 열어서 서버와 연결 */ HTTPConnectSockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(HTTPConnectSockFD < 0){ printf("[<31m[x][0m Socket open error!\n"); return -1; } alarm(3); status = connect(HTTPConnectSockFD, (struct sockaddr *)&serverAddress, sizeof(serverAddress)); if(status < 0) { printf("[<31m호스트에 연결이 되지 않습니다.[0m\n"); alarm(0); return -1; }// if(status < 0) { printf("[<32m[o][0m 성공적으로 연결되었습니다.\n"); return HTTPConnectSockFD; } /*************************************************************** * 접속된 host에 html 문서를 요청 ***************************************************************/ void Request(int reqsockfd, char *refer) { char message[512]; sprintf(message,"GET %s HTTP/1.0\r\n",refer); strcat(message, "User-Agent: WAY_bot(sorry.. test... http://www.qprk.pe.kr/way/)\r\n\r\n"); /* 실제로 소켓을 통해서 메세지를 보낸다. */ write(reqsockfd,message,sizeof(message)); } /*************************************************************** * 받아온 문서를 분석하여 정상적으로 처리가 되었는지 확인 ***************************************************************/ long Response(int ressockfd, char *htmlBuff ) { FILE *fp; int cnt=0, readcnt=0; char ch, headers[512]; long i; do{ if((readcnt = read(ressockfd, &ch,1)) == 1) headers[cnt++] = ch; else{ printf("[<31m[x][<0m Socket read error\n"); // close(HTTPConnectSockFD); return (-1); } }while(ch != '\n'); // printf("\n\n%s\n",headers); // getchar(); if(!CheckStatus(headers)){ // printf("[<31m[x][<0m 서버의 상태 코드가 2xx 게열이 아닙니다.\n"); // close(HTTPConnectSockFD); return (-1); } for(i=0; (readcnt = read(ressockfd,&ch,1)); i++) { if(readcnt == 1) *(htmlBuff+i)=ch; // fputc( ch, fp); else{ printf("[<31m[x][<0m Not reading\n"); // close(HTTPConnectSockFD); return i; } if (i >= MAX_HTML_BUFF -5) { printf("htmlBuff is Full!!\n"); return i; } } return i; } /*************************************************************** * http 해더가 정상인지 확인 ***************************************************************/ int CheckStatus(char *count) { int i,k=0; int j=0,l=0; char res[200]; for(i=0;i<strlen(count);i++){ if(*(count + i) == ' '){ l++; for(k=1;;k++){ res[j++] = *(count+i+k); if(*(count+i+k) == ' ') break; } res[j-1]='\0'; } if(l == 1) break; } if(atoi(res)>=302) return 0; else return 1; }
Forums:
HTTP/1.1을 쓰세요.
어떤 버츄얼 서버로 접속하는지를 알려주려면 HTTP/1.1을 쓰세요.
는 1.1에서는 다음과 같이 합니다.
댓글 달기