skeleton
15-02-2017, 21:32
Salve a tutti,
stavo cercando di scrivere un programma in grado di comunicare con diverse web page tramite socket e di salvare il loro contenuto html su client. In pratica gli indirizzi si trovano nel file "file.dat" e per ogni riga dello stesso il pc si mette in comunicazione con il server e riceve la pagina. Il problema nasce dal fatto che spesso (ma non sempre) il risultato del salvataggio della pagina html è
HTTP/1.1 403 Forbidden
Content-Type: text/html; charset=iso-8859-1
Content-Length: 235
Date: Wed, 15 Feb 2017 20:28:26 GMT
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//IT">
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
You don't have permission to access
on this server.<P>
</BODY></HTML>
in cui compare un fatidico errore 403. A cos'è dovuto? E soprattutto come mai questo problema si presenta soltanto alcune volte?
Allego per completezza anche il programma in c++. Perdonate se è scritto male ma è il copia-incolla di diversi file .h e relativi .cpp che ho compattato per non creare ulteriore confusione.
#include <winsock2.h>
#include <windows.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(){
int dataLength = 1;
char buffer[10000];
string sendbuf, text_recv;
string site_name;
fstream File ("file.dat", ios::in);
cout <<"Download: \n\n";
do{
WSADATA data;
WORD p;
p = MAKEWORD(2, 0);
if ( WSAStartup(p, &data) != 0){
cout << "Errore:\n\"Sistema operativo su cui è stato eseguito il programma non valido\"";
return 1;
}
SOCKET iResult, server;
struct sockaddr_in server_addr;
struct hostent *host;
host = gethostbyname("it.wikipedia.org");
//Inizializzazione della socket
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//Definisco gli attributi dalla socket attraverso la struttura predefinita sockaddr_in
server_addr.sin_family = AF_INET; //Address family
server_addr.sin_port = htons(80); //Porta
server_addr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
iResult = connect(server,(struct sockaddr*)&server_addr, sizeof(sockaddr_in));
//Se ci sono errori nella connessione
if (iResult != 0) {
cout<< "Errore:\n\"Impossibile connettersi\"","Connection - Error";
return 1;
}
File >> site_name;
cout <<"\t -> "<<site_name<<endl;
sendbuf = "GET /wiki/" + site_name + " http/1.1\nHOST: it.wikipedia.org\n\n";
send(server,sendbuf.c_str(), sendbuf.length(), 0);
//Creo file su cui salvo la pagina web
site_name += ".txt";
do{
buffer[0] = 0;
dataLength = recv(server,buffer,10000,0);
text_recv.append (buffer, dataLength);
} while(dataLength != 0);
ofstream SaveFile(site_name.c_str(), ios::out);
SaveFile<<text_recv;
SaveFile.close();
text_recv = "";
/* Chiusura Comunicazione col Server */
closesocket(server);
WSACleanup();
Sleep(1500);
} while (!File.eof());
File.close();
return 0;
}
Saluti a tutti e grazie in anticipo per l'aiuto :D
stavo cercando di scrivere un programma in grado di comunicare con diverse web page tramite socket e di salvare il loro contenuto html su client. In pratica gli indirizzi si trovano nel file "file.dat" e per ogni riga dello stesso il pc si mette in comunicazione con il server e riceve la pagina. Il problema nasce dal fatto che spesso (ma non sempre) il risultato del salvataggio della pagina html è
HTTP/1.1 403 Forbidden
Content-Type: text/html; charset=iso-8859-1
Content-Length: 235
Date: Wed, 15 Feb 2017 20:28:26 GMT
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//IT">
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
You don't have permission to access
on this server.<P>
</BODY></HTML>
in cui compare un fatidico errore 403. A cos'è dovuto? E soprattutto come mai questo problema si presenta soltanto alcune volte?
Allego per completezza anche il programma in c++. Perdonate se è scritto male ma è il copia-incolla di diversi file .h e relativi .cpp che ho compattato per non creare ulteriore confusione.
#include <winsock2.h>
#include <windows.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(){
int dataLength = 1;
char buffer[10000];
string sendbuf, text_recv;
string site_name;
fstream File ("file.dat", ios::in);
cout <<"Download: \n\n";
do{
WSADATA data;
WORD p;
p = MAKEWORD(2, 0);
if ( WSAStartup(p, &data) != 0){
cout << "Errore:\n\"Sistema operativo su cui è stato eseguito il programma non valido\"";
return 1;
}
SOCKET iResult, server;
struct sockaddr_in server_addr;
struct hostent *host;
host = gethostbyname("it.wikipedia.org");
//Inizializzazione della socket
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//Definisco gli attributi dalla socket attraverso la struttura predefinita sockaddr_in
server_addr.sin_family = AF_INET; //Address family
server_addr.sin_port = htons(80); //Porta
server_addr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
iResult = connect(server,(struct sockaddr*)&server_addr, sizeof(sockaddr_in));
//Se ci sono errori nella connessione
if (iResult != 0) {
cout<< "Errore:\n\"Impossibile connettersi\"","Connection - Error";
return 1;
}
File >> site_name;
cout <<"\t -> "<<site_name<<endl;
sendbuf = "GET /wiki/" + site_name + " http/1.1\nHOST: it.wikipedia.org\n\n";
send(server,sendbuf.c_str(), sendbuf.length(), 0);
//Creo file su cui salvo la pagina web
site_name += ".txt";
do{
buffer[0] = 0;
dataLength = recv(server,buffer,10000,0);
text_recv.append (buffer, dataLength);
} while(dataLength != 0);
ofstream SaveFile(site_name.c_str(), ios::out);
SaveFile<<text_recv;
SaveFile.close();
text_recv = "";
/* Chiusura Comunicazione col Server */
closesocket(server);
WSACleanup();
Sleep(1500);
} while (!File.eof());
File.close();
return 0;
}
Saluti a tutti e grazie in anticipo per l'aiuto :D