Ahoj,
Chtel bych vas prosim poprosit jestli nemate nekdo zkusenosti s programovanim na webu. Potrebuju vytvorit program v C na stazeni html stranky z webu. Vytvorim socket navazu spojeni se serverem, ale nevim jak bych mel naprogramovat to ze mi ten server posle stranku nebo jak se s tim vyporadat. Nevedel by jste prosim vas nekdo?
Predem diky za kazdy prispevek.
Fórum › C / C++
Stazeni html stranky
To jsem presne potreboval dik moc. Chtel bych se zeptat plati to obecne pro objekty na webu nebo jenom pro html stranky? Kdych tim chtel stahnou treba nejaky soubor nebo tak. // Odeslání dat
if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
{
cerr << "Problem s odeslanim dat" << endl;
return -1;
}
cout << "Odeslano " << size << endl;
// Prijem dat
text = "";
while (((size = recv(mySocket, buf, BUFSIZE - 1, 0)) != -1) && (size != 0))
{
buf[size] = '\0';
totalSize += size;
text += buf;
}
// Uzavru spojeni
close(mySocket);
Da sa povedat ze toto plati obecne pre kazdu komunikaciu TCP/IP.. tam vsak dalej este zalezi aky protokol chces na stiahnutie pouzit, ci FTP, HTTP alebo neviem co.. trosku sa situacia meni ak chces pouzivat SSL.. Trosku mi unika definicia pojmu 'objekty na webu' takze mozno sa nepochopime a napisal som tu nejaku blbost :)
chtel bych se prosim vas jeste zeptat, kdyz budu chtit stahnout obrazek. Jak bych mohl upravit tento kod aby mi stahoval obecne stranku nebo obrazek? kdyz zadam adresu kde je cil obrazek napise mi chybi ze je spatna adresa.
int stahni(char *filenamee){
string text("GET / HTTP/1.0\nhost: \n\n");
hostent *host; // Vzdaleny pocitac
sockaddr_in serverSock; // Vzdaleny "konec potrubi"
int mySocket; // Soket
char buf[BUFSIZE]; // Prijimaci buffer
int size, totalSize = 0; // Pocet prijatých a odeslanych bytù
ofstream output("./download.html");
// Zjistime info o vzdalenem pocitaci
if ((host = gethostbyname(filenamee)) == NULL)
{
cerr << "Spatna adresa" << endl;
return -1;
}
// Vytvorime soket
if ((mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
cerr << "Nelze vytvorit soket" << endl;
return -1;
}
// Zaplníme strukturu sockaddr_in
// 1) Rodina protokolu
serverSock.sin_family = AF_INET;
// 2) Cislo portu, ke kteremu se pripojime
serverSock.sin_port = htons(80);
// 3) Nastavení IP adresy, ke ktere se pripojime
memcpy(&(serverSock.sin_addr), host->h_addr, host->h_length);
// Pripojeni soketu
if (connect(mySocket, (sockaddr *)&serverSock, sizeof(serverSock)) == -1)
{
cerr << "Nelze navazat spojeni" << endl;
return -1;
}
// Odeslání dat
if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
{
cerr << "Problem s odeslanim dat" << endl;
return -1;
}
cout << "Odeslano " << size << endl;
// Prijem dat
text = "";
while (((size = recv(mySocket, buf, BUFSIZE - 1, 0)) != -1) && (size != 0))
{
buf[size] = '\0';
totalSize += size;
text += buf;
}
// Uzavru spojeni
close(mySocket);
cout << "Prijato " << totalSize << " bytu" << endl << "HTTP Hlavicka:" << endl << endl;
// Rozdelim HTTP odpoved
int offset = text.find("\r\n\r\n");
copy(text.begin(), text.begin() + offset + 2, ostream_iterator<char>(cout,""));
copy(text.begin() + offset + 4, text.end(), ostream_iterator<char>(output,""));
}
No totizto u teba je problem ten ze si sa nemrkol na specifikaciu HTTP protokolu. Neviem teda ci vies alebo nevies ako prebieha komunikacia pomocou HTTP protokolu. Totizto ty posles na server poziadavku - request a on ti odpovie - response. Ako vlastne vyzera jednoduchy request napriklad na http://www.nejaka_adresa.sk/images/obrazok_1.png? Ty sa pripojis na www.nejaka_adresa.sk na port 80 a posle sa (najjednoduchsi) request:
GET /images/obrazok_1.png HTTP/1.1
Host: www.nejaka_adresa.sk
User-Agent: Experiment
<prazdny riadok>
Riadok je ukoncovany dvojicou <CR><LF>. Na to ti pride odpoved od servera. Ta sa zacina HTTP hlavickou a nasledne telom. Moze vyzerat nasledovne:
HTTP/1.0 200 OK
Date: Fri, 13 Mar 2008 08:39:47 GMT
Content-Type: image/png
Content-Length: 1354
....
Co teda robi tvoj kod? On sa proste pripoji na nejaku adresu a pozle request:
GET / HTTP/1.0
host:
Cize vlastne je to nejaky taky ekvivalent toho ked napises do prehladaca napriklad z www.moja_adresa.sk cize sa ti zobrazi index.html. KEd si do googla hodis 'HTTP protocol specification' tak ti vyhodi kvantum pouzitelneho materialu.Bohuzial bez studia HTTP protokolu sa neda robit s HTTP protokolom :) Tieto veci si vsak nemusis pracne pisat, uz su napisane. Staci sa pozriet na kniznicu libCURL.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Stažení souboru ze stránky s cookies — založil anuvin
Stažení zdrojového kódu externí stránky — založil tom*p
Parsování html stránky — založil beachboy
Načtení html stránky s javascriptem — založil mfaudio
CSS HTML Okraj stranky — založil dominik
Moderátoři diskuze