[c++] winsock + pobieranie .jpg, .exe

0

Jak w temacie, chciałbym pobrać plik nie tekstowy, np .jpg, .exe, .mp3 , za pomocą tego programu:

#include <winsock2.h>
#include <cstring>
#include <string>
#include <iostream>
#include <fstream>
 
using namespace std;
 
u_long resolveHost( const string & host )
{
	LPHOSTENT hostEntry = gethostbyname(host.c_str());
 
	if ( !hostEntry )
	{
		unsigned int addr = inet_addr( host.c_str() );
		hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);
 
		if ( !hostEntry )
		{
			return 0;
		}
	}
 
	return *((int*)*hostEntry->h_addr_list);
}
 
int main(int argc, char* argv[])
{
	cout<<"Do jakiej strony sie podlaczyc ?\n>";
    string hoscik;
    cin>>hoscik;
    cout<<"Podaj sciezke do pliku\n>";
    string sciezka;
    cin>>sciezka;
    cout<<"Zapisz jako:\n>";
    string nazwa;
    cin>>nazwa;
    
    WSADATA		wsaData;
	SOCKADDR_IN saddr;
	SOCKET		sock;
	string		http_req = "GET ";
	http_req +=sciezka;
	http_req +=" HTTP/1.1\r\n";
	http_req +="HOST: ";
	http_req +=hoscik;
	http_req +="\r\n";
	http_req +="User-Agent: Major browser/1.1 (Windows; Windows NT 5.1; pl)\r\n";
	http_req +="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,*/*;q=0.5\r\n";
	http_req +="Accept-Language: pl,en-us;q=0.7,en;q=0.3\r\n";
	//http_req +="Accept-Encoding: gzip,deflate\r\n";
	http_req +="Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7\r\n";
	http_req +="Keep-Alive: 300\r\n";
	http_req +="Connection: keep-alive\r\n";
	http_req +="\r\n\r\n";
	cout<<"\n";
    cout<<http_req;
    char		index[1024*200] = { 0 };
 
	WSAStartup( MAKEWORD(2,2), &wsaData );
 
	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	saddr.sin_addr.S_un.S_addr = resolveHost (hoscik.c_str());
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(80);
 
 
	if ( connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR )
	{
		/* połączenie się nie powiodło */
		sock = 0;
		cout<<"poloczenie nie powiodlo sie\n";
		system("pause");
		return 0;
	}
 
	send(sock,http_req.c_str(),strlen(http_req.c_str()),0);
	recv(sock,index,1024*200,0);
 
	cout << index << endl;
	fstream plik;
	plik.open(nazwa.c_str() , ios::out);
	plik<<index;
	plik.close();
 
	closesocket(sock);
	WSACleanup();
	system("pause");
	return 0;
}

ale dostaję przy pobieraniu przykładowego .jpg ( http://strony.aster.pl/senq/blog/120.jpg ) cośtakiego :

˙Ř˙ŕ

o so chodzi ?

sprawdziłem wireshark'iem i obraz "dochodzi" do mojego kompa, ( po wklejeniu hex'ów z wiresharka do notatnika,zapisaniu jako .jpg i uruchomieniu okazało się że jest poprawny )

0

Nie korzystaj ze strumieni / otwórz w trybie binarnym.

0

co mam otworzyć w trybie binarnym ?

jak to mam nie używać strumieni ? to co mam używac ?

;-( ;-( ;-( ;-( ;-(

pomożecie ?

0

nie. stogu powiedzial juz Ci dosc wyraznie co jest nie tak. otwierasz strumien tekstowy a pakujesz do niego zywe bajty. rownie dobrze mozesz pojsc pogadac ze swoja babcia po chinsku i kazac jej to zapisywac na kartce. ciekawe czy potem odczytasz.. otworz strumien w trybie binarnym i uzywaj zapisow binarnych a nie operatora tekstowego << czy >>, albo sie przerzuc na fopen(?,'b')/fwrite/fclose... to jest kurka podstawowowka!!!

0

dzięki, zmyliło mnie to że mam nie używać strumieni..... bo nie znam innego sposobu jak strumieniem.... a okazało się jednak że strumieniem mam otworzyć, dzięki jeszcze raz

0

Jak coś to zrobiłem to tak...

#include <winsock2.h>
#include <cstring>
#include <string>
#include <iostream>
#include <fstream>
 
using namespace std;
 
u_long resolveHost( const string & host )
{
	LPHOSTENT hostEntry = gethostbyname(host.c_str());
 
	if ( !hostEntry )
	{
		unsigned int addr = inet_addr( host.c_str() );
		hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);
 
		if ( !hostEntry )
		{
			return 0;
		}
	}
 
	return *((int*)*hostEntry->h_addr_list);
}
 
int main(int argc, char* argv[])
{
	cout<<"Do jakiej strony sie podlaczyc ?\n>";
    string hoscik;
    cin>>hoscik;
    cout<<"Podaj sciezke do pliku\n>";
    string sciezka;
    cin>>sciezka;
    cout<<"Zapisz jako:\n>";
    string nazwa;
    cin>>nazwa;
    
    WSADATA		wsaData;
	SOCKADDR_IN saddr;
	SOCKET		sock;
	string		http_req = "GET ";
	http_req +=sciezka;
	http_req +=" HTTP/1.1\r\n";
	http_req +="HOST: ";
	http_req +=hoscik;
	http_req +="\r\n";
	http_req +="User-Agent: Major browser/1.1 (Windows; Windows NT 5.1; pl)\r\n";
	http_req +="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,*/*;q=0.5\r\n";
	http_req +="Accept-Language: pl,en-us;q=0.7,en;q=0.3\r\n";
	//http_req +="Accept-Encoding: gzip,deflate\r\n";
	http_req +="Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7\r\n";
	http_req +="Keep-Alive: 300\r\n";
	http_req +="Connection: keep-alive\r\n";
	http_req +="\r\n\r\n";
	cout<<"\n";
    cout<<http_req;
    char		index[1024*200] = { 0 };
 
	WSAStartup( MAKEWORD(2,2), &wsaData );
 
	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	saddr.sin_addr.S_un.S_addr = resolveHost (hoscik.c_str());
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(80);
 
 
	if ( connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR )
	{
		/* połączenie się nie powiodło */
		sock = 0;
		cout<<"poloczenie nie powiodlo sie\n";
		system("pause");
		return 0;
	}
 
	send(sock,http_req.c_str(),strlen(http_req.c_str()),0);
	recv(sock,index,1024*200,0);
 
	cout <<index << endl;
	fstream plik;
	plik.open(nazwa.c_str() ,ios::out | ios::binary);
	plik.write(index, sizeof(index));
	plik.close();
 
	closesocket(sock);
	WSACleanup();
	system("pause");
	return 0;
}

</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1