2016-07-11 3 views
2

안녕하세요 저는 sockets을 사용하는 데있어 매우 익숙하며 아직 익숙하지 않습니다. 기본적으로 수행하려는 것은 string variableweb address (예 : www.example.com/index.php?Example=StringExample)으로 전달하고 응답을받습니다. 예를 들어 반환합니다. "Test Example"index.php 경우는 다음과 같이 보았다 :C++ WinSock PHP 페이지에서 데이터 가져 오기?

여기
<?php 

if($_GET['Example'] == "StringExample") 
{ 
    echo "Test Example"; 
} 

?> 

내가 C++로 시도했습니다 무엇 : 내가 잘못

struct sockaddr_in SocketAddress; 
hostent* addr = gethostbyname("www.example.com/index.php?Example=StringExample"); 
int sizeofaddr = sizeof(addr); 
SocketAddress.sin_addr.s_addr = inet_addr(addr->h_name); 
SocketAddress.sin_port = htons(80); 
SocketAddress.sin_family = AF_INET; 

SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL); 
if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0) 
{ 
    return 0; //Failed to Connect 
} 

char buffff[256]; 
recv(Connection, buffff, sizeof(buffff), NULL); 
//"Test Example" now stored in buffff 

을 뭐하는 거지?

내 경우에는 librariesboost 또는 이와 비슷한 것으로 사용하고 싶지 않습니다. 도움말 :

답변

4
gethostbyname("www.example.com/index.php?Example=StringExample"); 

"www.example.com/index.php?Example=StringExample"에 대한 감사는 유효한 서버 이름이 아닙니다. 이것은 전체 URL입니다. 서버 이름은 "www.example.com"이됩니다. gethostbyname()은 URL이 아닌 서버 이름을 사용하고 IP 주소를 반환합니다. 또한 gethostbyname()은 폐기되었습니다. 새로운 코드는 대신 getaddrinfo(3) 함수를 사용해야합니다.

이것은 분명히 HTTP URL입니다. HTTP를 통해 문서를 다운로드하려면 소켓 연결 만하는 것보다 훨씬 많은 작업이 필요합니다. 소켓 연결을 설정하는 것은 HTTP 서버에서 문서를 다운로드하는 과정의 첫 단계 일뿐입니다. 유효한 HTTP 요청을 보낸 다음 서버에서 HTTP 응답을 수신해야합니다.

curl과 같이 HTTP 문서를 다운로드하는 데 필요한 전체 클라이언트 측 프로세스를 구현하는 많은 라이브러리가 있으며 소켓 연결 자체를 처리합니다.

하지만이 방법을 구현하는 데는 아무런 문제가 없습니다. 그것은 좋은 프로그래밍 excersize.

1) 서버의 포트 80, 기본 HTTP 포트에 연결하려면

그래서, www.example.com의 IP 주소를 해결 한 후, 당신은해야합니다.

2) "/index.php?Example=StringExample"에 대한 HTTP 요청을 보냅니다.

3) HTTP 응답을 구문 분석하십시오.

HTTP 요청 및 응답에 대한 사양은 RFC 2616으로 정의되며 HTTP 요청 및 응답 구성 방법에 대한 전체 설명서를 참조 할 수 있습니다.당신은 소켓 웹 서버에 액세스하려면

1

, 당신은 명심해야한다 :

  • 당신은 당신의 웹 서버에 TCP/IP 연결을 열 수 있습니다
  • 하지만 이후 당신은 할 필요가 HTTP 프로토콜은 귀하의 예제의 경우 자신

기준 :

hostent* addr = gethostbyname("www.example.com"); 
//... 
const char* request = "GET index.html" 
send(Connection, request, strlen(request), NULL) 
//fetch index.html with a recv and parse it 

이어야합니다 정확하게, 당신이 당신의 서버에 접근하고 싶다면 GET, PUT, POST 등이 http 프로토콜에 어떻게 구현되어 있는지, 웹 서버에 적절한 명령을 보내고 응답을 recv()했는지 살펴 봐야한다.

관련 문제