PDA

View Full Version : [C++] Errore 403 - comunicare con pagina web tramite socket


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

tomminno
27-02-2017, 09:00
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 :)