2013-12-16 4 views
3
int RiotAPI::getSite(std::string hostname) //RiotAPI is my class, almost empty atm 
{ 

if (wsa) //wsa is true, dont mind this. 
{ 
    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_socktype = SOCK_STREAM; 

    errcode = getaddrinfo(hostname.c_str(), HTTPPORT, &hints, &result); //HTTPPORT defined as "80" <- string 
    if (errcode != 0) 
    { 
     printf("getaddrinfo() failed error: %d\n", errcode); 
    } 
    else 
     printf("getaddrinfo success\n"); 

    /*for (ptr=result; ptr != NULL; ptr->ai_next) 
    { 
     cSock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); 
     if (cSock == INVALID_SOCKET) 
     { 
      printf("Socket creating failed.\n"); 
     } 
    }*/ 

    cSock = socket(result->ai_family, result->ai_socktype, result->ai_protocol); //didnt bother looping through results because the web address only returns 1 IP 

    errcode = connect(cSock, result->ai_addr, (int)result->ai_addrlen); 
    if (errcode != 0) 
     printf("Could not connect to the server"); 
    else{ 
    char request [] = "GET /api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key=<MY_API_KEY> HTTP/1.0\r\n"; 
    send(cSock, request, (int)strlen(request), 0); 

    char output [256]; 
    int bytesrecv = 0; 
    //char * cmp = "{\"id\":585897,\"name\":\"RiotSchmick\",\"profileIconId\":583,\"summonerLevel\":30,\"revisionDate\":1387143444000,\"revisionDateStr\":\"12/15/2013 09:37 PM UTC\"}"; 
    bytesrecv = recv(cSock, output, 255, 0); 
    printf("Bytes read: %d\n", bytesrecv); 
    printf("Output string: %s\n", output); 
    } 
} 
    return 0; 
} 

저는 Riot Games API (League of Legends)를 사용하는 프로그램을 작성하려고했습니다.WinSock2 HTTP GET 사용

내 코드가 잘 작동해야하며 내 친구 서버에서 웹 페이지를 가져 와서 작동했지만 색인이 필요했습니다. (I는 "GET HTTP/1.0 \ 연구 \ 없음"을 사용)

나는이 URL의 내용을 얻고 싶다면 :

http://prod.api.pvp.net/api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key=<here_goes_my_api_key> 

내가 이런 식으로 진행하지 않는 것이 좋습니다 :

1) htt : //prod.api.pvp.net에 연결하십시오

2) "GET /api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key= HTTP/1.0 \ r \ n을 보냅니다. "

3) recv()가 0을 반환하면 버퍼를 출력합니다 (내 공동 작업에서는이 작업을 수행하지 않습니다.) 드하지만, 난 그냥 작동하는지 확인 255 바이트를 받았다)

문제는 그냥 recv() 함수 (블록?)에 앉아있다. 내 GET 요청에 문제가 있습니까?

가 여기에 API 정보 페이지의 : 내 요청의 헤더하지만 같은 일을 사용하려고 않았다 http://i.imgur.com/yXr5BYx.png

, RECV()는 단지 거기에 앉아있다.

나는 또한이 시도했습니다

이 불과 3 개 무작위 jibberish의 문자를 반환하는 동안 :

char buffer [2048]; 
recv(cSock, buffer, 2047, 0); 
printf("Output string: %s\n", buffer); 

이 코드는 완전히 페이지 (모든 2048 바이트 그래도 가득)을 반환합니다.

std::string output = ""; 
char buffer [128]; 
//int bytesrecv = 0; 

while (recv(cSock, buffer, 127, 0) > 0) 
{ 
    output += buffer; 
} 
printf("Output string: %s\n", output); 

답변

1

귀하의 GET 요청은 최소한이 말에 ... 빈 라인으로 종료 즉 \r\n\r\n을 필요로 완료되지 않았습니다. 그러나 서버가 여러 도메인을 서비스하고있는 경우 Host 헤더를 요구하는 등의 다른 문제가 발생할 가능성이 있습니다 ...

+0

예, 끝 부분에 \ r \ n \ r \ n을 수정했습니다 ... 그런 다음 코드 아래에 2 가지 문제가 있습니다. 두 번째 부분은 무엇을 의미합니까? – user2699298

+0

웹 서버가 여러 도메인을 호스팅하고 있다고 가정 해 봅시다. GET 요청에서 기본 페이지를 요청하면 웹 서버는 Host 헤더를 통해 어떤 도메인을 참조하는지 알 수 있습니다. HTTP/1.1 헤더 일지라도 많은 서버가 필요합니다. recv 차단은 서버가 요청을 완료 할 때까지 기다리는 것을 나타냅니다 ... – mark

+0

하지만 API 정보에서 그렇게 지정하지 않습니까? 첫 번째 게시물에 API 설명서의 이미지를 추가했습니다. – user2699298