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;
}