|
|
|
![]() |
|
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: 03:34.