|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
[c] programma download http
questo codice prima richiede una pagina dal mio sito, poi prova a scaricare un filmato di megavideo... altervista mi risponde perfettamente, mentre megavideo non si fa sentire dopo che mando il mio GET lui non risponde, sta muto ... sto impazzendo...
grazie mille per l'aiuto Codice:
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
bool scarica(char *fileremoto,char *filelocale,char *host,char modalita);
int main(int argc, char *argv[]){
scarica("/forum2/","a.txt","www.mamo139.altervista.org",'1');
scarica("/files/4ce85b10a5de4f47ea02d653021d0b42/","a.txt","www785.megavideo.com",'1');
getchar();
}
bool scarica(char *fileremoto,char *filelocale,char *host,char modalita){
FILE *fo;
struct sockaddr_in sock; //la struttura per il socket
struct hostent ip; //la struttura per l'indirizzo
bool header = true;
bool invio = false;
char ultimo_carattere = '\0';
char msg_response[] = "\0";
char modo[4];
int s;
//messaggio per il server...
char msg_enter[600] = "GET ";
char protocollo[] = " HTTP/1.1\n";
char protocollo2[] = "Host: ";
char protocollo3[] = "\n";
char dettagli1[] = "Keep-Alive: 300\n";
char dettagli2[] = "Connection: keep-alive";
strcat(msg_enter,fileremoto);
strcat(msg_enter,protocollo);
strcat(msg_enter,protocollo2);
strcat(msg_enter,host);
strcat(msg_enter,protocollo3);
//strcat(msg_enter,dettagli1); //header
//strcat(msg_enter,dettagli2);
strcat(msg_enter,"\n\n");
strcpy(modo,(modalita == '1' ? "w+b" : "w"));
fo=fopen(filelocale,modo); //creazione file
//********* connessione *********//
WORD wVersion;
WSADATA wsaData;
wVersion = MAKEWORD(2, 2);
WSAStartup(wVersion, &wsaData); //winsock startup
s = socket(AF_INET, SOCK_STREAM, 0);
ip = *(gethostbyname(host)); //indirizzo
memcpy(&sock.sin_addr, ip.h_addr, ip.h_length); //copia l'indirizzo nella struttura socket
sock.sin_family = AF_INET;
sock.sin_port = htons(80); //porta
connect(s, (struct sockaddr *)&sock, sizeof(sock)); //associa al socket s la struttura socket
if (!s) {
printf("Connessione non riuscita!!");
getchar();
return false;
}
printf("Inviato al server:\n\n%s\n", msg_enter);
send(s, msg_enter, strlen(msg_enter) + 1, 0); //invia dati
printf("Download in corso...\n\n");
while(recv(s, msg_response, 1, 0) != 0) {
// se sono finiti gli header stampa nel file
if (!header) fprintf(fo,"%c",msg_response[0]);
else printf("%c",msg_response[0]);
// se l'ultimo carattere è uguale a \r, quello attuale è uguale a \n
// e prima c'era già stato un invio (invio==true), mette header=false
if (ultimo_carattere == 13 && msg_response[0] == 10 && invio==true) header=false;
// ulteriore controllo sugli header
((ultimo_carattere == 13 && msg_response[0] == 10) || (ultimo_carattere==10 && invio))?invio=true:invio=false;
// memorizza l'ultimo carattere
ultimo_carattere = msg_response[0];
//fprintf(fo,"%c",msg_response[0]);
}
printf("File Ricevuto\n");
//operazioni di chiusura!
shutdown(s, 2);
closesocket(s);
WSACleanup();
fclose(fo);
return true;
}
__________________
http://mamo139.altervista.org |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Probabilmente necessita anche di altri header.
Guarda con WireShark la richiesta che viene inviata dal browser e cerca di duplicarla. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
ho provato ad inviare con firefox solo l'header che invio io, cioè Host e funziona!!!
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
ho modificato questa riga da send(s, msg_enter, strlen(msg_enter) + 1, 0); a send(s, msg_enter, strlen(msg_enter), 0); e ora funziona... per così poco non andava grazie
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
anziché lavorare coi sockets non facevi prima ad usare Windows Internet o WinHTTP?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
gia che ci sono lo chiedo: esiste un api che mi permette di prendere una pagina tramite un proxy (ovviamente l'indirizzo del proxy glielo passo io come parametro)??
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
In C non so quale libreria fornisca questa funzionalità (di sicuro ci sarà e qualcuno te la segnalerà), usando Java invece è molto semplice. L'utilizzo del C è un vincolo per te?
__________________
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
però ho guardato i pacchetti in transito quando imposto un proxy nel browser e non sembra molto complicato... adesso ci provo e vi dico come va. grazie comunque
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Potrebbe essere una buona occasione per studiare un nuovo linguaggio "moderno".
Come C#, Java o Python. p.es. In C# tutto quello che hai scritto si riduce a 2 righe di codice. E con il proxy 3. Codice:
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient();
//wc.Proxy = new WebProxy(....);
wc.DownloadFile(@"http://www.hwupgrade.it/forum/showthread.php?p=25760450#post25760450", @"c:/QuestoThread.txt");
}
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
non è che ha qualche dipendenza particolare?? tipo librerie?? ad asempio il tuo programma funziona su un windows xp he sp1 basebase con nulla installato o ci vuole qualche pacchetto .NET o robe varie installate??
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
ovviamente ci vuole il .NET framework installato.
Ma solo quello. Questo per qualsiasi programma fatto in C# o VB.net (o C++.net), anche solo Hello World.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
Quote:
Per poterlo eseguire devi avere installato il framework .Net
__________________
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
finche riesco a cavarmela con 20 minuti di smanettamenti continuo così... appena incontro uno scoglio insormontabile proverò a cambiare linguaggio... però non facendo per lavoro ma solo per hobby alla fine mi diverto quasi a complicarmi la vita
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Allora buona goduria
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
dai sempre per rimanere a lavorare con le socket grezze vi chiedo questo:
quando provo a connettermi con: connect(s, (struct sockaddr *)&sock, sizeof(sock)); come posso impostare un timeout, in modo che se il server non mi risponde il mio programma non sta piantato delle ore ad aspettare??
__________________
http://mamo139.altervista.org |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Codice:
import urllib
urllib.urlretrieve("http://www.hwupgrade.it/forum/showthread.php?p=25760450#post25760450", "C:\QuestoThread.txt")
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Abbiamo un nuovo cdimauro tra di noi...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:05.




















