소켓프로그래밍으로 웹서버의 HTML을 긁어오려면..?

toold의 이미지

소켓프로그램을 작성중인데요..
웹서버에 connect해서 HTML을 가져오려고 합니다..
일단 웹서버에 connect하는 부분까지는 만들었는데요..
HTML을 어떻게 가져오는건지...
그런 함수가 있는건가요.?
(결국 proxy서버를 만드는겁니다..)
힌트라도 좋으니 부탁드립니다..
아래는 현재까지 만든 웹서버에 연결부분의 소스입니다..
(주석이 좀 틀렸어도 너그러이 이해해 주시길 완전히 이해를 못해서요..^^)

	//웹서버와 연결하기 위한 소켓 생성
	if((connectSD = socket(PF_INET, SOCK_STREAM, 0)) < 0)
		error_handling("connectSD socket() error");

	//DNS주소를 IP주소로 변환
	host = gethostbyname(addr);
	if(!host)
		error_handling("gethostbyname() error");
	//각 IP포워딩(?)들을 모두 가져옴
	for(i=0; host->h_aliases[i]; i++) puts(host->h_aliases[i]);
	
	//connectSD 구조체 초기화
	memset(&webserv_addr, 0, sizeof(webserv_addr));
	webserv_addr.sin_family = AF_INET;
	webserv_addr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)host->h_addr_list[0]));
	webserv_addr.sin_port = htons(80);

	printf("http://%s 웹서버에 연결 요청중..\n", addr);
	//웹서버에 연결 요청
	if(connect(connectSD, (struct sockaddr *)&webserv_addr, sizeof(webserv_addr)) == -1)
		error_handling("connect() error");
	printf("웹서버와 연결 됨\n");
fliers의 이미지

HTTP 프로토콜을 이해하셔야 겠죠.
RFC 문서를 참조해보시면 되겠지만

간단하게는

GET /패스/파일명 HTTP/1.1
Accpet: */*
Host: 호스트:포트
Connection: close

처럼 하면될것 같네요.

저런식으로 보내면 서버가 응답하게 됩니다.
POST 방식의 경우에는 좀 달라지죠.

connection:close 를 안해주게 되면 keep-alive로 작동되기도 하는데
tcp연결을 안끊어버리기 때문에 좋을 수도 있지만... 안좋을 수도 있죠 :)
그렇게되면 또 response되는 헤더에 chucked 인가 뭔가가 있던데
16진수로 된 문자를 한줄 보내고 그 길이만큼 보내고 또 16진수를 보내고
또 그만큼 보내고.. 중간중간 잘라보내더군요. 0이 될때까지 읽어오면되고요.

맹고이의 이미지

GET으로 받아서 stdout으로 뿌리는 간단한 예제...

int main() {
   
   /* 어쩌구 저쩌구 생략 */

   char buffer[MAX_BUFFER]; 
   ssize_t n; 

   sprintf(buffer, "GET /\n"); 
   write(sockfd, buffer, strlen(buffer)); 

   while(1) { 
      n = read(sockfd, buffer, MAX_BUFFER); 
      if(n == 0) 
         break; 
      fwrite(buffer, sizeof(char), n, stdout); 
   } 
}
toold의 이미지

오늘 정말 도움을 많이 받네요...감사...꾸벅..^^..
맹고이님께서 알려주신 방법으로 해서..
HTML을 가져왔는데요..
이상한건...
네이버나 엠파스 같은경우는 HTML전체를 똑바로 가져오는데요..
DAUM 같은건...
아래와 같은 소스를 가져옵니다..
왜 그런거죠..?..
로그인 때문은 아닌것 같고..
이런 식으로 연결하는게 올바르지 않는 연결방법인가요..?..

Quote:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.daum.net/">here</a>.</p>

또 다른 사이트는 제가 다니는 학교 사이트입니다...
여기는 제대로 나올때도 있고..어쩔때는 아래와 같이 나옵니다..

Quote:

<html><head><title>Error 404 Not found
</title></head><body bgcolor=#ffffff><h2>Error 404 Not found
</h2><p>The host name in the URL you have requested does not match any virtual server currently running. This may be because you entered the host name incorrectly, or because the necessary server alias has not been set up.<p><i>Powered by <a href="http://errors.zeus.com/">Zeus Technology</a></i></body></html>
progcom의 이미지

Quote:
<title>302 Found</title>
<title>Error 404 Not found</title>

HTTP 상태 코드입니다. HTTP 규격 문서를 먼저 살펴보시는게 좋을 듯 싶네요.
302는 해당 페이지가 존재한다..는 상태코드로, HTTP 헤더 부분을 보면 리다이렉션되는 위치가 있을겁니다.
404는 에러지요. 페이지가 존재하지 않을 경우에 나옵니다.

fliers의 이미지

제가 위에도 썼지만 HTTP 버전이 다르기 때문입니다.
요즘은 HTTP/1.1과 Host를 반드시 명시해줘야지 사이트를 제대로 알아봅니다.
웹호스팅을 하는 곳이 많기 때문이죠.

위에 다음의 경우는 progcom님이 설명하신대로고요..

Saintlinu의 이미지

HTTP 1.1의 경우 host / Accept 등의 많은 내용을 모두 첨부하여

쿼리해야 정확한 문법이 됩니다.

보통 HTTP 1.0과 호환하는 웹서버의 경우 GET / POST등의 Method에

대한 쿼리를 정확히 파싱하여 결과를 뿌려주게 됩니다.

행복하세요 ^_^

다즐링의 이미지

이더리얼을 설치하셔셔 인터넷 익스플로어로 서핑하는걸 캡쳐해보십시오.

쉽게 보입니다.

------------------------------------------------------------------------------------------------
Life is in 다즐링

toold의 이미지

Saintlinu wrote:
HTTP 1.1의 경우 host / Accept 등의 많은 내용을 모두 첨부하여

쿼리해야 정확한 문법이 됩니다.

보통 HTTP 1.0과 호환하는 웹서버의 경우 GET / POST등의 Method에

대한 쿼리를 정확히 파싱하여 결과를 뿌려주게 됩니다.


여러분들의 답변 감사드립니다..

대충 뭐가 잘못됬는지는 알겠는데요....

HTTP관련 질문들을 검색해봤는데.. 대부분 개념적인 설명만..ㅠ.ㅠ..

혹시 참고할 만한 소스를 볼 수 있는 곳이 있을까요...

GET /패스/파일명 HTTP/1.1
Accpet: */*
Host: 호스트:포트
Connection: close

이부분의 실제 소스를 좀 보고 싶은데요... 너무 간단한 걸 어렵게 생각하나요..^^;

progcom의 이미지

toold wrote:
GET /패스/파일명 HTTP/1.1
Accpet: */*
Host: 호스트:포트
Connection: close

이부분의 실제 소스를 좀 보고 싶은데요... 너무 간단한 걸 어렵게 생각하나요..^^;

HTTP 헤더는 \r\n으로 구분하는 텍스트일뿐입니다. 그냥 소켓에 써주면 그만인것이지요 :) 규격으로 정해져이기 때문에 굳이 소스?같은걸 찾을 건 없습니다. 실제로 규격 자체도 상당히 간단 명료하고요. (텍스트 전송일뿐이니...)

RFC 2616이 HTTP/1.1 규격입니다. HTTP 프로그램을 한다면 먼저 읽어보셔야하는겁니다. :D

toold의 이미지

아래와 같이 해주었는데요..

Quote:

char buf_GET[] = \
"GET / HTTP/1.0\r\n"
"Host: www.xxx.co.kr:80\r\n" \
"\r\n";

Host주소는 특정 사이트라 x로 표시했습니다..
HTML은 제대로 가져오는데요...
이게 프레임으로 되어 있습니다..
아래와 같이요..
이걸 클라이언트쪽으로 뿌려주면 웹브라우저에서 프레임이 나누어지는데..
프레임 HTML파일들을 읽어오지 못해서 "작업 취소"라고 나옵니다..
막막하네요...힌트 좀 부탁드립니다..^^;
Quote:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title></title>
</head>

<frameset rows="71,*" leftmargin="0" marginwidth="0" marginheight="0" frameborder="NO" border="0" framespacing="0">
<frame src="top.php" name="topFrame" scrolling="no" noresize marginwidth="0" marginheight="0" >
<frame src="main.php" name="mainFrame">
</frameset>
</html>

aeuiop의 이미지

각 프레임 별로 별도의 HTTP 요청이 필요합니다.

프레임 소스를 보면 top.php, main.php가 더 필요하므로,

각각의 페이지에 대한 요청을 보내야겠죠.

그리고 이렇게 질문하시는 것 보다는

위에서 한 분이 언급하셨지만,

패킷 스니퍼를 설치하신 다음,

웹 브라우저가 어떤 식으로 행동하는 지 확인해 보세요.

가장 널리 사용되는 프로그램으로,

ethereal이란 프로그램이 있습니다.

http://www.ethereal.com (근데 지금 접속이 안 되네요 :? )

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.