2013-08-24 2 views
0

문자열 (또는 char [])에 페이지의 html을 넣으려고합니다 ... (등) 기본 소켓을 사용하는 방법을 알고 있습니다. 클라이언트/서버 ...사이트의 HTML 가져 오기

나는 ...

의 IP & 포트를 얻을 과거에 클라이언트를 작성하고, 연결하고, 클라이언트 & 서버 타협 이미지와 같은 사용하여 소켓을 보낼 것

인터넷을 조금 검색 한 결과 웹 사이트에 연결하여 GET 요청을 보내서 페이지의 HTTP 콘텐츠를 가져 와서 변수에 저장한다는 것을 알았습니다. 몇 가지 문제가 있습니다.

1) 사이트의 기본 페이지가 아닌 페이지의 HTML을 가져 오려고합니다. 예를 들어 stackoverflow.com이 아니라 stackoverflow.com/help와 같은 것입니다 ("사이트의 공식 페이지"가 ​​아닙니다. 그러나 해당 사이트 안에 뭔가)

2)는

은 내가 사용할 수있는 외부 라이브러리가 보았다 ... 보내거나 내가 GET 요청에서 얻은 데이터를 저장하는 중 방법을 잘 모르겠지만, 오히려 소켓을 사용하는 경우에만 ... 그런데

- 나는 윈도우 7을 사용하고, 나는 그것 (실 거예요 리눅스에서 작업하는 경우는 잘 그래서) Windows에서만 작동거야

을 목표로

고마워요! :)

+0

타사 코드를 사용하려는 경우 http://www.codeproject.com/Articles/2425/Get-The-HTML-Source-of-Any-Web-Page – spt025

+2

HTTP 프로토콜이 예쁘게 보입니다. 언뜻 보면 똑바로 보이지만 많은 어려움이 있습니다. 나는 그것을 수동으로 구현하려고하지 말라고 강하게 권합니다. 실제로는 기존 라이브러리를 사용해야합니다. – syam

+0

어떻게 코드를 작성하면 더 구체적으로 말할 수 있는지 알려주겠습니다. – spt025

답변

1

일부 호스트의 리소스에 액세스하려면 요청의 첫 번째 줄에서 'GET'바로 다음에 리소스 경로를 지정하면됩니다. 예 : 나는 또한 Boost.ASIO 대신 소켓 같은 일부 휴대용 라이브러리를 사용하여 권 해드립니다 것 http://www.jmarshall.com/easy/http/#http1.1

GET /path/file.html HTTP/1.1 
Host: www.host1.com:80 
[blank line here] 

확인합니다. 그러나 저는 여러분에게 HTTP 프로토콜을 구현하는 기존의 이식 가능한 라이브러리를 사용할 것을 강력히 권고합니다. 물론 그것을 구현하는 방법을 배우는 문제가 아닌 경우에만.

직접 구현하려는 경우에도 기존 솔루션을 알고 있어야합니다.

#include <stdio.h> 
#include <curl/curl.h> 

int main(void) 
{ 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); 
     /* example.com is redirected, so we tell libcurl to follow redirection */ 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 

     /* Perform the request, res will get the return code */ 
     res = curl_easy_perform(curl); 
     /* Check for errors */ 
     if(res != CURLE_OK) 
      fprintf(stderr, "curl_easy_perform() failed: %s\n", 
        curl_easy_strerror(res)); 

     /* always cleanup */ 
     curl_easy_cleanup(curl); 
    } 
    return 0; 
} 

두 라이브러리를 이식 ​​:

using namespace boost::network; 
using namespace boost::network::http; 

client::request request_("http://127.0.0.1:8000/"); 
request_ << header("Connection", "close"); 
client client_; 
client::response response_ = client_.get(request_); 
std::string body_ = body(response_); 

이것은 당신이 컬 라이브러리 (http://curl.haxx.se/libcurl/c/simple.html)를 사용하여 그것을 할 수있는 방법입니다 : 예를 들어 이것은 당신이 CPP-NETLIB (http://cpp-netlib.org/0.10.1/index.html)를 사용하여 웹 페이지를 얻을 수있는 방법이다 그러나 Windows 특정 API를 사용하고 싶다면 WinINet (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383630%28v=vs.85%29.aspx)을 확인해 보는 것이 좋지만 사용하기가 쉽지 않습니다.

+0

OpenCV를 사용할 때마다 EXE가있을 때마다 2 DLL을 복사해야했기 때문에 다른 라이브러리를 사용하고 싶지 않고 꽤 성가시다. 휴대용 라이브러리 arel은 좋아한다, 도서관 나는 단지 포함해야한다. 그러나 보통의 .h 파일 또는 무엇인가 규칙적으로 행동하지 않는다? – Amit

+0

about 페이지의 HTML을 얻으려고했습니다 : 이것이 작동하지 않지만 보내는 메시지입니다 : ' "GET/about/HTTP/1.1 \ r \ nHost : stackoverflow.com \ r \ nConnection : close \ r \ n \ r \ n "; ' – Amit

+0

Boost.ASIO는 헤더 전용 라이브러리이며 HTTP 동시 클라이언트의 예입니다. http://www.boost.org/doc/libs/1_54_0 /doc/html/boost_asio/example/cpp03/http/client/sync_client.cpp. –