Avatar billede jimmykf Nybegynder
18. marts 2005 - 19:00 Der er 4 kommentarer og
1 løsning

http request svar skrevet til fil buffer giver blandet text

Jeg har et problem med et stykke simpelt net kode, der skal hente en html side fra en server, og skrive det til en fil.
Serveren modtager requesten og svarer OK (kode 200) hver gang, og programmet modtager html tekst.

Problemet er at når den buffer, som mit socket bruger til at gemme data i, bliver skrevet ud til en ofstream-åbnet fil (http.temp), så er der nogle steder hvor dele af en tidligere buffer's tekst står skrevet igen, hvilket i bund og grund vil sige at html syntaksen bliver ødelagt.

Jeg har checket at den side der bliver hentet har korrekt syntaks.

Noget kunne tyde på at bufferen der bliver skrevet til filen ikke bliver tømt imellem hver receive, men efter at have forhørt mig hos 'kyndige' kodere skulle dette ikke være problemet.

Jeg har added min http-socket kode nedenstående.




int HTTPconnection(string URL)
{
/////// SPLITTER FOR THE URL ///////////////
        string path;
        //checking for, and removing "http://"
        if( URL.substr(0,7) == "http://" )
                URL = URL.substr(7, strlen( URL.c_str() ) );
        //Finding and isolating the host name "www.example.com"
        char ch;
        string tmpHost = "";
        for (unsigned int i = 0; i < strlen( URL.c_str() ); i++)
        {
                ch = URL[i];
                if( ch == '/' )
                {
                        path = URL.substr(i, strlen( URL.c_str() ) );
                        break; //end of the hostname
                }
                //If it's not a "/" then it's part of the hostname
                tmpHost += ch;
        }

        //Copy the string into the const char cstring
        char host[256]; //socket code needs a const char
        if( strlen( tmpHost.c_str() ) > 255 )
                return 1;
        strcpy(host, tmpHost.c_str());
/////// END OF SPLITTER ////////////////////

/////// HTTP Socket code ///////////////////
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
                ShowMessage("WSAData fuckup");
                return 1;
    }
        int numbytes;
        struct hostent *he;
        struct sockaddr_in their_addr; // connector's address information

        if ((he=gethostbyname(host)) == NULL)
        {  // get the host info
                ShowMessage("gethostbyname fuckup");
                return 1;
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) //inet and tcp
        {
                ShowMessage("socket filedescriptor fuckup");
                return 1;
        }

        their_addr.sin_family = AF_INET;    // host byte order
        their_addr.sin_port = htons(PORT);  // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

        if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
        {
                ShowMessage("connect fuckup");
                return 1;
        }

        string httprequest;
        httprequest = "GET ";
        httprequest += path;
        httprequest += " HTTP/1.0\r\nHost: ";
        httprequest += host;
        httprequest += "\r\nConnection: Keep-Alive\r\nUser-Agent: ";
        httprequest += "\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n\r\n";

        if (send(sockfd, httprequest.c_str(), strlen(httprequest.c_str()), 0) == -1)
        {
                ShowMessage("send fuckup");
                return 1;
        }

//////////// TEMP //////////////
        unlink("temp.http");
        ofstream fout;
        fout.open( "temp.http", ios::app );
        if( fout.fail() )
        {
                ShowMessage("Couldn't save to file");
                return 1;
        }
//////////// TEMP //////////////

//////// HER MODTAGES HTML DATAEN ////////////
        while((numbytes = recv(sockfd,buf,sizeof(buf)-1,0)) > 0)
        {
                fout << buf; //Bufferen skrives til filen
        }

        fout.close(); //filen lukkes

        if(numbytes == -1)
        {
                ShowMessage("Socket error");
        }

    shutdown( sockfd, 1); //nice way of telling the oposite side that the connection will be terminated. how=1.
    closesocket(sockfd); //Closes the Socket FileDescriptor
        return 0;
}
Avatar billede jimmykf Nybegynder
18. marts 2005 - 19:02 #1
Kommentar til: "Jeg har checket at den side der bliver hentet har korrekt syntaks."

Her menes at hvis jeg henter siden med enten FireFox eller IE så har siden en korrekt syntax.
Avatar billede arne_v Ekspert
18. marts 2005 - 19:10 #2
Du skal bruge numbytes til at bestemme hvor mange tegn du vil udskrive til filen !
Avatar billede arne_v Ekspert
18. marts 2005 - 19:10 #3
buf[numbytes] = '\0';

eller lignende
Avatar billede jimmykf Nybegynder
18. marts 2005 - 20:19 #4
@arne v:
Det var det magiske svar.
Jeg takker.
Hvis du skriver en besked som svar så får du pointene.
Avatar billede arne_v Ekspert
18. marts 2005 - 20:25 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester