WinSock mit Subdomain



  • Hallo,
    ich habe folgenden Code

    #include <winsock2.h>
    #include <windows.h>
    #include <iostream>
    #pragma comment(lib,"ws2_32.lib")
    using namespace std;
    int main (){
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
            cout << "WSAStartup failed.\n";
            system("pause");
            return 1;
        }
        SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        struct hostent *host;
        host = gethostbyname("api.steampowered.com");
        SOCKADDR_IN SockAddr;
        SockAddr.sin_port=htons(80);
        SockAddr.sin_family=AF_INET;
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
        cout << "Connecting...\n";
        if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
            cout << "Could not connect";
            system("pause");
            return 1;
        }
        cout << "Connected.\n";
        send(Socket,"GET / HTTP/1.1\r\nHost: api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend\r\nConnection: close\r\n\r\n"),0);
        char buffer[10000];
        int nDataLength;
        while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
            int i = 0;
            while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
                cout << buffer[i];
                i += 1;
            }
        }
        closesocket(Socket);
            WSACleanup();
        system("pause");
        return 0;
    }
    

    Diese Seite möchte ich gerne auslesen:
    http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend
    (Braucht nicht versuchen daraufzuklicken, ihr braucht zum aufrufen der Seite einen Code den ich hier zensiert habe).

    Wenn ich jetzt aber mein Programm starte sagt es mir immer "Bad Request". Könnt ihr mir sagen wie ich das zum laufen kriege?

    Grüße!

    Edit: Ich habe mir grade mal gethostbyname("api.steampowered.com") ausgeben lassen, und dabei kam 00000000 raus.. Wenn ich aber den Link hier auf der Seite zurückverfolgen lasse erhalte ich eine IP: http://www.hcidata.info/host2ip.cgi
    Hab dann mal die Ip von der Seite eingesetzt, jetzt bekomme ich ein 404 Not Found..



  • Wie kannst du überhaubt eine Verbindung aufbauen wenn du von gethostbyname NULL bekommst? Du brauchst ja die IP. Ausserdem ist gethostbyname deprecated. Verwende getaddrinfo http://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx



  • Ins Host-Feld gehört nur die (Sub-)Domain, keine URL (der Pfad gehört idealerweise als relativer Pfad direkt hinter das "GET")



  • Ich habe das ganze jetzt so abgeändert:

    SockAddr.sin_addr.s_addr = inet_addr("63.228.223.110");
    //...
    //...
    send(Socket,"GET / HTTP/1.1\r\nHost: /ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: /ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend\r\nConnection: close\r\n\r\n"),0);
    

    Ich bekomme immernoch ein 404 Fehler, wenn ich aber in meinem Browser

    63.228.223.110/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend

    eingebe, dass lande ich auf der gewollten Seite. Wie kann das sein?



  • Du gibst auch immer noch den Pfad als Host an.

    Das Schema ist:

    Get /ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend
    ...
    Host: api.steampowered.com
    

Log in to reply