Casualmente acabo de termianr un servidor HTTP en C++. Y eso es justo lo que hago jaja
Para evitar tener una variable de 5 megas, o de 1 giga incluso, hago esto:
char arr[1024];
ifstream f("...",ios::binary);
while(!f.eof()){
f.read(arr,1024);
if(f.eof())
serv.send(0,string(arr,f.gcount()));
else
serv.send(0,string(arr,1024));
}
Está en C++.
serv.send() es para enviarle a un cliente de mi servidor la string.
f.gcount() devuelve la cantidad de bytes leídos (en caso de no haber leído el tamaño del array (1024) )
Donde yo pongo serv.send(), tú pondrías send(socket,... ...).
Es eso, no más. Un dato importante: Si envías muchos datos rápidamente, send() puede devolver error WSAWOULDBLOCK. Por lo tanto, te aconsejo que coloques el socket como blocking antes de enviar.
Para ello, un snippet:
void setBlocking(SOCKET sock, bool blocking){
u_long block = blocking ? 0 : 1;
ioctlsocket(sock, FIONBIO, &block);
}
Ese es un método de "partir" e ir enviando el archivo mientras lo lees.
Bueno, creo que eso es todo.