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에서는 다음과 같이 합니다.
댓글 달기