|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
[C++] Errore 403 - comunicare con pagina web tramite socket
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 è Codice:
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> 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. Codice:
#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;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ciao,
hai provato a navigare con un browser gli url che stai provando a scaricare? I motivi per cui stai ottenendo 403 possono essere molteplici: pagine dietro autenticazione, controllo lato server sulla presenza di una sessione, cookie... Ti merita usare una libreria come cUrl per gestire il protocollo http, sempre che tu non abbia voglia e tempo per implementarti un client http. In buona sostanza aprire un socket non è sufficiente |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:07.



















