socket 을 사용하여 web page를 받아올때 버추얼서버의 내용을

qprk의 이미지

소켓을 사용하여 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;
}


김민식의 이미지

어떤 버츄얼 서버로 접속하는지를 알려주려면 HTTP/1.1을 쓰세요.

Quote:
GET /disp.html HTTP/1.0

는 1.1에서는 다음과 같이 합니다.
GET /disp.html HTTP/1.1
Host: www.qprk.pe.kr

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.