Hey
Med udgangspunkt i de artikler der har været skrevet her på siden vedr. winsocks og HTTP 1.1 vil jeg gerne lave et program der henter en binær fil. Men det vil ikke som jeg vil.
Hvis jeg f.eks. forsøger at hente et JPG billede som hedder u.jpg ser min ConnectAndRead således ud:
void connectAndRead(string host)
{
//Denne buffer kommer til at indeholde, hvad vi læser
unsigned char buffer[1024];
//Denne variabel fortæller os, hvor mange bytes vi læser
unsigned int bytesRead;
//Lav et socket objekt uden timeout
TCPSocket sock(host,80);
//Forbind
sock.connect();
//HTTP request
string toSay = string("GET /u.jpg HTTP/1.1\\r\\nHost: ") + host + string("\\r\\nConnection: close\\r\\n\\r\\n");
sock.write(toSay.c_str(),toSay.size());
ofstream outputfile("output.txt", ios::out | ios::app | ios::binary);
try
{
//Denne løkke forlades, når forbindelsen lukkes
while(1)
{
//Læs til buffer
bytesRead = sock.read(buffer,sizeof(buffer));
//Skriv til fil
outputfile << buffer;
}
} catch (ConnectionLostException & cle)
{
//Serveren stoppede forbindelsen. Dette lader os bare forlade den
//ellers uendelige løkke
}
sock.close();
outputfile.close();
}
Resultatet bliver en output.txt med følgende indhold:
HTTP/1.1 200 OK
Date: Wed, 02 Nov 2005 01:50:34 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) PHP/4.3.10-15 proxy_html/2.4 mod_ssl/2.0.54 OpenSSL/0.9.7e
Vary: Host
Last-Modified: Fri, 21 Oct 2005 00:12:51 GMT
ETag: "84e66-317-88bf66c0"
Accept-Ranges: bytes
Content-Length: 791
Connection: close
Content-Type: image/jpeg
|ÿØÿà
men hvor er det binære jpg billede? Som jeg tolker responset finder den fint billedet. Men hvorfor bliver det ikke også lagret i min buffer? Hvis jeg forsøger at hente en HTML eller tekst fil går det fint med at få indholdet med. Det må vel være min Read-metode der ikke kan hente binære værdier eller hvad?
Min Read-metode er taget direkte fra artiklen her på siden og ser således ud og ligger i TCPSocket.cpp
SInt32 TCPSocket::read(void * buffer, SInt32 size)
{
//Denne variabel indeholder antallet af bytes
//som vi læser
SInt32 bytesRead;
//Vent først på data
waitForData();
//Hvis vi nåede til denne linje er der data til os
bytesRead = recv(m_socket,(char*)buffer,size,0);
//Hvis 'bytesRead' er -1, gik noget galt
if(bytesRead == -1)
{
#if defined(__linux__)
throw NetException(strerror(h_errno));
#elif defined(_WIN32)
LPVOID lpMsgBuf;
int err = WSAGetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL
);
string description((char*)lpMsgBuf);
LocalFree( lpMsgBuf );
throw NetException(description);
#endif
}
//Hvis vi læste 0 bytes er forbindelsen stoppet
else if(bytesRead == 0)
{
throw ConnectionLostException("Connection reset by peer.");
}
return bytesRead;
}
[Redigeret d. 02/11-05 04:15:59 af stuffer]