[Winsock] - Problem mit HTTP Header



  • #include <winsock.h>
    #include <stdio.h>
    
    int main()
    {
        // private
        WSADATA     wsa;
        struct      sockaddr_in addr;
        int         sockClient;
        char        szHost[]="www.c-plusplus.net";
        char        szFilename[]="forumstart.html";
        char        szSavename[]="seite.html";
        char        szUrl[MAX_PATH];
        char        *szBuffer;
        IN_ADDR     *addrServer;
        HOSTENT     *heHost;
        int         iBytes=0;
        FILE        *hFile;
    
        const int   iBufferSize=1024;
    
        // allocate
        szBuffer = new char[iBufferSize];
    
        // get url
        if(strlen(szFilename)>0)
            wsprintf(szUrl, "http://%s/%s", szHost, szFilename);
        else
            wsprintf(szUrl, "http://%s/%s", szHost, "index.htm");
        MessageBox(0, szUrl, 0, 0);
    
        // setup sockets
        if (WSAStartup(MAKEWORD(1, 1), &wsa)){
                printf("WSAStartup() error");
                fflush(stdin);
                getchar();
                return 0;
        }
        printf("WSAStartup() successful\n");
    
        // resolve hostname
        heHost      = gethostbyname(szHost);
        addrServer  = (IN_ADDR*) heHost->h_addr_list[0];
    
        // socket
        sockClient = socket(AF_INET, SOCK_STREAM, 0);
        CopyMemory(&addr.sin_addr, heHost->h_addr_list[0], sizeof (addr.sin_addr));
        addr.sin_port = htons(80);
        addr.sin_family = AF_INET;
        if(sockClient==-1){
            printf("socket failure\n");
            fflush(stdin);
            getchar();
            return 0;
        }
        printf("socket created successful\n");
    
        // connect
        if(connect(sockClient, (struct sockaddr *)&addr, sizeof(addr)) == -1){
            printf("connect() failed");
            fflush(stdin);
            getchar();
            return 0;
        }
        printf("connected to %s\n", inet_ntoa(addr.sin_addr));
    
        // create file
        hFile = fopen(szSavename, "w+");
        if(hFile==NULL)
            printf("could not create file\n");
    
        // prepare header
        wsprintf(szBuffer, "GET %s HTTP/1.1\r\n", szUrl);
        wsprintf(szBuffer, "%sAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n", szBuffer);
        wsprintf(szBuffer, "%sAccept-Language: de\r\n", szBuffer);
        wsprintf(szBuffer, "%sAccept-Encoding: gzip, deflate\r\n", szBuffer);
        wsprintf(szBuffer, "%sUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n", szBuffer);
        wsprintf(szBuffer, "%sHost: %s\r\n", szBuffer, szHost);
        wsprintf(szBuffer, "%sConnection: Keep-Alive\r\n", szBuffer);
        MessageBox(0, szBuffer, 0, 0);
    
        // send buffer
        send(sockClient, szBuffer, strlen(szBuffer), 0);
    
        // recv
        while(iBytes=recv(sockClient, szBuffer, iBufferSize, 0)){
            if(iBytes!=0)
                szBuffer[iBytes]=0;
    
            printf("%s", szBuffer);
    
            fprintf(hFile, "%s", szBuffer);
        }
    
        // cleanup
        delete[] szBuffer;
        fclose(hFile);
        closesocket(sockClient);
        return 0;
    }
    

    Bei der while-Schleife hängt sich das Prog auf, was ist falsch?
    Wenn ich aber nur "Get %ADRESSE" nehme dann geht es 😞

    cu para
    😃



  • @paranoiac.org
    Ich würde mal denken, das der szBuffer überansprucht wird, da 1024 vielleicht doch zu wenig sind.

    MfG Unwissender 🙂



  • Original erstellt von Unwissender:
    **@paranoiac.org
    Ich würde mal denken, das der szBuffer überansprucht wird, da 1024 vielleicht doch zu wenig sind.

    MfG Unwissender :)**

    Wieso sollte es den zu wenig sein.
    Es geht doch wenn ich nur GET nehme. Aber ich möchte einen kompletten Header mitsenden.



  • Ich würd iBytes nach dem recv auf jeden Fall noch auf SOCKET_ERROR also -1 prüfen.

    EDIT:
    Daran liegts aber nicht sondern das du _zwei_ mal am ende deiner anfrage \r\n senden musst, sonst wartet der server auf weitere zeichen und sendet dir nichts, deswegen hängts dann auch beim recv da das ja ein blocking call ist.

    [ Dieser Beitrag wurde am 18.01.2003 um 16:08 Uhr von blackdeath editiert. ]



  • Achso.
    Soll ich dann alle "\r\n" weglassen bis auf das letzte??



  • So wie ich das verstanden habe sollst bzw. musst du einfach am Ende nochmal ein zweites \r\n senden 😉

    [ Dieser Beitrag wurde am 18.01.2003 um 20:00 Uhr von flenders editiert. ]


Anmelden zum Antworten