PDA

View Full Version : Protocolli Internet explorer?


keeper83
06-05-2003, 08:23
Volevo sapere i protocolli di internet explorer per poter far conversare il browser con un mio server.
Praticamente io riesco solo a inviare al browser solo file html puri che vengono visualizzati, mentre quando mi richiede di inviare i file di immagine ( o di downloadare un qualsiasi file) non riesco a farlo.
Qualcuno sa come fare? o dove reperire delle info? :p

cionci
06-05-2003, 08:58
Gli devi passare il mimetype... Guarda come funziona la richiesta da un server HTTP normale:

Questa la richiesta:

C:\>telnet forum.hwupgrade.it 80
GET /images/smiles/icon_mad.gif HTTP/1.1
Host: forum.hwupgrade.it

E questa sotto la risposta:

HTTP/1.1 200 OK
Date: Tue, 06 May 2003 06:49:47 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux mod_gzip/1.3.19.1a
Last-Modified: Fri, 13 Dec 2002 15:10:00 GMT
ETag: "91ce4cf-177-3df9f848"
Accept-Ranges: bytes
Content-Length: 375
Content-Type: image/gif

GIF89aı‗└└└▄ı╬╠╔┬┴┤▒░ף⌂}!♦☺,♠└P*▬╚BpP0▲Gj P

N♥╩jD,R(V┼╩;▲D-*T♥W
[↔#E
♠♦LN↓▼$E

e▬* $'t↕*►↕↨▲*&j*▬▬↓∟ #%(jJ∟↔▼!$&┼IE"#$%IA;F*↨∟!%E


Date, Server, Last-Modified, ETag, Accept-Ranges, Cionnection non dovrebbero essere indispensabili... Content-Type e Content-Length sono indispensabili...

Il protocollo HTTP/1.1 (come specificato dalla richiesta) inoltre non prevede la disconnessione dopo l'invio di un elemento...resta disponibile ad accettare nuove richiest successive...

cionci
06-05-2003, 09:03
Se vuoi reperire dell info:

http://www.ietf.org/rfc/rfc2616.txt?number=2616

keeper83
06-05-2003, 21:20
grazie mille penso proprio che tu abbia centrato la mia richiesta :p
appena ho tempo provo tutto :D

keeper83
15-05-2003, 16:02
Ancora dubbi :rolleyes:
Content-Length la lunghezza del messaggio che devo mandare DOPO il protocollo giusto?

a proposito esiste una funzione per determinare la lunghezza di un file

cio il corrispettivo dell' strlen() delle stringhe in pratica...

cionci
15-05-2003, 17:01
E' la lunghezza del file...

Sicuramente, ma mi sembra che sia system dependent... Su che sistema operativo programmi ?

keeper83
15-05-2003, 17:12
sto cercando di usare ANSI C in modo che vada dappertutto cmq per ora sono sotto Win 98 cmq dovrebbe funzionare anche sotto linux

Senno come faccio a scorrere il file con l'fread byte per byte per contarlo?

char ciao[LMAX];
ex=fread(ciao,sizeof(char),1,fp);

cosi me lo prende un byte?

keeper83
15-05-2003, 17:38
-_____-" perfetto ora conto perfettamente la lunghezza del file ...
(controllo dalle propriet in win)
peccato che non me lo mandi lo stesso -_-"

devo spedirlo byte per byte????
ora come ora faccio cosi:

do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
Write(newsock,messaggio,sizeof(messaggio)); //Invio il Messaggio
}while(!feof(fp));

cionci
16-05-2003, 12:05
Originally posted by "keeper83"


do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
Write(newsock,messaggio,sizeof(messaggio)); //Invio il Messaggio
}while(!feof(fp));
Non devi spedirlo byte per byte, ma puoi usare tranquillamente un buffer...

Come fai te ci potrebbero essere vari problemi, io farei cos:

do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
if(!feof(fp))
Write(newsock,messaggio,ex); //Invio il Messaggio
}while(!feof(fp));

cionci
16-05-2003, 12:07
Collegati con telnet al tuo server e fai un richiesta:

GET /tuapagina.html HTTP/1.1
Host: 127.0.0.1
Seguito da due invii...

Copia ed incolla qui ci che il tuo server risponde...

keeper83
16-05-2003, 14:17
... Perche non ci ho pensato prima????? :pig:

cionci
16-05-2003, 14:36
Funziona ora ?

keeper83
16-05-2003, 15:39
... no ora no mi invia solo il protocollo senza file... mi rileggo il codice e controllo cosa puo essere ...

se ti rompo dimmelo che mi arrangio
perche avro tante domande da farti penso :/

cmq grazie :)

cionci
16-05-2003, 16:04
Prova cos:

do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
Write(newsock,messaggio,ex); //Invio il Messaggio
}while(!feof(fp))

keeper83
16-05-2003, 16:37
do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
if(feof(fp)) //prima era if(feof(fp))
Write(newsock,messaggio,ex); //Invio il Messaggio
}while(!feof(fp));
l'errore era l anegazione nell' feof

cmq non riesco a capire con le pagine html funziona perfettamente mentre i file immagine non li manda -_- non che ci vuole qualcosa in coda al file?

ah forse .. ho controllato "ex" e quando eof resta a 0 quindi non manda l'ultimo "pacco" di roba

se non erro non riesco a sostituirlo con strlen(messaggio) perch se un byte \0 mi finisce la stringa prima che sia finita realmente...

sizeof(messaggio) prende 1024 se " char messaggio[1024]; " ??

cionci
16-05-2003, 16:43
Lascia ex che serve a gestire anche il caos dello zero...

Cos come l'hai modificato se il file pi lungo di 1024 fa casino...

Fai quello che ti ho detto prima con telnet...

keeper83
16-05-2003, 16:57
se il file corto e minore di 1024 non arriva nulla (solo il protocollo)

appunto perche Ex 0 come dirci

Write(newsock,messaggio,0);


questo quello che risponde:

HTTP/1.1 200 OK
Allow: GET, HEAD, POST
Accept: text/html
Content-Length: 491
Content-Type: image/gif

cionci
16-05-2003, 17:01
Se il file corto in ex ci dovrebbe essere 491...

cionci
16-05-2003, 17:03
Comunque credo che tu debba togliere Accept e Allow...

keeper83
16-05-2003, 17:13
no non funfa. :muro:

cmq ho messo un printf per ex ed 0
solo che ora ho provato un file piu lungo di 1024 e non va comunque ... -_- anche se ho tolto i parametri che hai detto -_-

cionci
16-05-2003, 17:18
Sicuro che il file sia stato aperto bene ?
Sicuro fp sia diverso da NULL ?

keeper83
16-05-2003, 17:35
Si ci ho messo il controllo cmq
Selezione pagina predefinita index.html
L'estensione del file e': .html
Il file e' lungo 83

Settato protocollo di ritorno:
HTTP/1.1 200 OK
Allow: GET, HEAD, POST
Accept: text/html
Content-Length: 83
Content-Type: text/html


0<html>
<H1>
FILE index.html<BR><BR>
prova prova prova!!! ^_^
</H1>
</HTML>


Inviato file richiesto


l' 0 prima della pagina ex in quel momento e mi pare ovvio che non mandi i dati perch ne spedisce ex cio 0 :/
pero il fatto che mi apre il file e me lo stampa con la printf mi assicura che lo abbia letto :/

Questo quello che riceve il client invece

HTTP/1.1 200 OK
Allow: GET, HEAD, POST
Accept: text/html
Content-Length: 83
Content-Type: text/html





Idee?

cionci
16-05-2003, 17:43
Mi fai vedere tutto lo spezzone del codice dall'apertura alla chiusura del file (comrpesa la stampa con printf) ?

keeper83
16-05-2003, 17:50
void read_file(void)
{
int fp; //puntatore al file
int i,ex;
char ciao[1];
for(i=0;i<LMAX;i++)//Svuoto il buffer
{
messaggio[i] = NULL;
}

if((fp=fopen(rich_file,"rb")) != 0) //Se trova la pagina la prende e la mette nel buffer di risposta
{
count=0;
do
{
ex=fread(ciao,sizeof(char),1,fp);
count++;
}while(!feof(fp));
count=count-1; //questo mi da dubbi sempre 1 + del valore della grandezza del file ( se da qin un file 83 byte questo viene 84 ) da questo -1 solo che mi lascia perplesso
fclose(fp);
printf("\nIl file e' lungo %d",count);
parametri(); //preparazione risposta al client
Write(newsock,protocollo,strlen(protocollo)); //Invio il protocollo

if((fp=fopen(rich_file,"rb")) != 0)
{
do//Inizio trasmissione dati
{
ex=fread(messaggio,LMAX,1,fp); //LMAX = 1024
printf("%d\n",ex);
printf("%s",messaggio);
Write(newsock,messaggio,ex); //Invio il Messaggio
}while(!feof(fp));
fclose(fp);
}
printf("\nInviato file richiesto");
}
else
{
printf("\nFile non trovato!");
}

}


P.S. ora esco ci si sente poi

cionci
16-05-2003, 18:31
Devi leggere cos ;)

ex=fread(messaggio,1,LMAX,fp);

keeper83
16-05-2003, 20:10
..... doh erroraccio ... eppure mi pareva di averci guardato sull'help....

cmq ... :muro:
ok me lo manda tutto ma....
GIF89a?   #$ ((&&,,//..77'43000==5AB,IH?@@3IH7PP;UUEQQRWVKedQbc_``g|{jzzm~} ,?@pH,Ȥh:(&1<X -M- DQzn|Nn9*^*$W$Z{ ( & & &&&zS0X` 0Oě \ - gS`3ppϔ"h񁄂]aV\p"XÏM ^%$RAhȂ\`Hr@J(rH*M;

Questo mi viene scritto sulla pagina web invece di visualizzarla come immagine -___-"

Ora faccio un controllo col telnet se gli arriva giusto il protocollo :mc:

keeper83
16-05-2003, 20:33
Da telnet pare tutto apposto che c'e di sbagliato ??? :cry:

HTTP/1.1 200 OK
Content-Length: 491
Content-Type: image/gif

GIF89a?


((&&,,//..77'43000==5AB,IH?@@3IH7PP;UUEQQRWVKedQbc_``g|{jzzm~}
*,?@pH,Ȥh:(&1<X
-M- DQ
zn|Nn9*^*$W$Z{
( & & &&&zS0X`
0
O \ - gS`3ppϔ"h
]aV\p"XÏM ^%$RAhȂ\Hğ@´(H*M;

Mezzetti0903
16-05-2003, 21:18
Cionci...non pensare di essermi sfuggito....

quando keeper avr risolto...SEI MIO...

ti prego...mi serve una mano per una richiesta POST ad un server... ti preg...ti preg... :D :D :D :D

cionci
17-05-2003, 10:20
Originally posted by "keeper83"

Da telnet pare tutto apposto che c'e di sbagliato ??? :cry:

HTTP/1.1 200 OK
Content-Length: 491
Content-Type: image/gif

GIF89a?


((&&,,//..77'43000==5AB,IH?@@3IH7PP;UUEQQRWVKedQbc_``g|{jzzm~}€€„„ƒ…ŒŒ…‘
‘އ–•ˆ••Œ˜˜*,?@—pH,Ȥh:Ÿ(&1<X
-M- DQŠ
zn|Nn9*^*$W$Z{Š
(Ž‘’“”•“ ˜™š›œ& & &&™&œ‹zS0X„`
0
O \ –- gS`„‚3pp”"h
„‚]aV\p"XÏM… ^%$RAh‚\ŒHŸŸ@´(H“*M;
Sinceramente non so quali siano le direttive indispensabili... Prova ad inserire tutte quelle che vedi sotto..

HTTP/1.1 200 OK
Date: Tue, 06 May 2003 06:49:47 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux mod_gzip/1.3.19.1a
Last-Modified: Fri, 13 Dec 2002 15:10:00 GMT
Accept-Ranges: bytes
Content-Length: 375
Content-Type: image/gif

cionci
17-05-2003, 10:21
Originally posted by "Mezzetti0903"

ti prego...mi serve una mano per una richiesta POST ad un server... ti preg...ti preg... :D :D :D :D
Avevo gi visto il tuo post sul POST :cool:, ma non sapevo aiutarti...credo che l'unica soluzione sia di andarsi a spulciare lo standard...

keeper83
19-05-2003, 11:14
Ancora non funziona ma ho notato che confrontando il file immagine originale e quello inviato sono diversi :/

Il secondo va a capo e manca qualche byte ogni tanto ... perche dovrebbe fare questo?

Ho provato anche a mandare l'immagine senza protocolli ( il mio prof mi ha fatto vedere che da linux funziona ) ma qui non va... probabilmente perch non un'immagine valida in quanto arriva errata :/

keeper83
19-05-2003, 11:26
aTTIMO CHE SISTEMO IL POST

cionci
19-05-2003, 14:44
Prendi la stessa immagine e mettila dietro ad Apache o IIS... Fai una richiesta al server per la stessa immagine e confronta i dati...

keeper83
22-05-2003, 16:02
Questo parametro:
ETag: "91ce4cf-177-3df9f848"

Dove lo trovo???

ho fatto i controlli con l'apache e ... beh pare che arrivi uguale identica a quella che mando dal mio server :eek:

Quindi provo a mettere i parametri uno per uno e guardo se erano quelli a non funzionare :mc:

cmq... si dove lo trovo quell' Etag ?

cionci
22-05-2003, 16:43
Non lo so...nella documentazione dello standard credo che tu lo possa trovare...

keeper83
23-05-2003, 15:40
Io ci rinuncio ... ora ci rispondo la stessa identica cosa che ci risponde l'Apache Server ma... Nulla non mi visualizza un .... *biiiip*


Se ti va di darci un'occhiata... DEVE essere una cavolata che non lo fa funzionare... solo che io non la trovo ;__;

sotto linux il mio prof manda il file immagine praticamente senza protocollo, qui non va ne con ne senza....

In questa versiuone del prg l'Etag e la data sono fisse copiate pari pari dall'Apache per vedere se andava... ma penso che non sia un problema di protocolli ormai ..

cionci
23-05-2003, 16:31
Ci do un'occhiata...

cionci
23-05-2003, 16:54
Non mi tornano diverse cose...

int fp; //puntatore al file

Quando invece dovrebbe essere un FILE *...
Poi l'uso che fai del NULL con i buffer...
Inoltre ad un certo punto assegni ad un elemento di un buffer "\0"...ed ovviamente mi da errore...

cionci
23-05-2003, 16:55
Ah...sto usando Dev-C++ per compilarlo (quindi mingw)...

keeper83
23-05-2003, 17:52
Originally posted by "cionci"

Non mi tornano diverse cose...

int fp; //puntatore al file

Quando invece dovrebbe essere un FILE *...
Poi l'uso che fai del NULL con i buffer...
Inoltre ad un certo punto assegni ad un elemento di un buffer "\0"...ed ovviamente mi da errore...


ehmm dunque ...
- per il FILE credo che sia la stessa cosa almeno in Ansi C ... comunque funziona in entrambi i modi.... vabb si in effetti ho messo int perche l'ho visto in un esempio e pensavo che FILE non funzionasse sotto ambiente Unix

- l'uso dei null se non sbaglio lo faccio per trovare la fine della stringa nei buffer.

- rich_file[i+1]="\0"; qui forzo la fine della stringa per spezzarla ed estrarre solo il nome del file e quello che mi serve ( il nome e l'estensione)

a me compilato cosi non da errori magari se mi dici che riga guardo


uhm.... ora esco appena torno vedo che mi dici ciao :)

cionci
23-05-2003, 18:04
rich_file[i+1]="\0";

Magari intendevi: rich_file[i+1]='\0';

Strano che ti funzioni...

Comunque il problema altrove...mi raccomando non ti sparare :o
La sequenza di fine riga \r\n e non \n\r come usi tu !!! :muro: :muro:

Guarda questo programma e prova con un browser a connetterti dulla porta 8000 e vedrai che esce quando il browser ha terminato la richiesta...

#include "sock.h"
#include <stdio.h>
#include <stdlib.h>

#define PORT 8000

int main()
{
int sock, newsock;
char cliente[1025];
char buffer[10241];
int n, i, pos = 0;

if((sock = Socket()) < 0)
return -1;

Bind(PORT, sock);
Listen(sock);

if((newsock = Accept(sock, cliente)) < 0)
return -1;

printf("\n\n----------------------------------------------\n");
printf("Richiesta da [%s]\n",cliente);
fflush(stdout);

do {
n = Read(newsock, buffer+pos, 10240-pos);
if(n <= 0)
return -1;
pos+=n;
printf("\nPos: %d N: %d\n", pos, n);
for(i=pos-n; i<pos; ++i)
printf("%d ", buffer[i]);
} while(buffer[pos-4] != '\r' || buffer[pos-3] != '\n'
|| buffer[pos-2] != '\r' || buffer[pos-1] != '\n');

buffer[pos] = '\0';
printf("\n%s\n",buffer);

close(newsock);
close(sock);
Sockend();

system("PAUSE");
return 0;
}

cionci
23-05-2003, 18:16
Originally posted by "keeper83"

- l'uso dei null se non sbaglio lo faccio per trovare la fine della stringa nei buffer.
Usa lo 0...il NULL si usa con i puntatori... Inoltre non serve perch la fine della lettura te la ritorna la Read...

keeper83
23-05-2003, 19:51
Originally posted by "cionci"


Usa lo 0...il NULL si usa con i puntatori... Inoltre non serve perch la fine della lettura te la ritorna la Read...

Infatti se vedi in alcuni c' NULL e in altri 0 ........ ahem ... :pig:


"\0" e '\0' dovrebbe essere la stessa cosa no? solo che con il secondo si piglia un solo carattere.... o no? ... beh adesso faccio un po di prove ma...
il fatto del \r\n mi fa puzzare il naso ... visto che la connessione pignolissima con l'[invio] o a capo come preferisci ^^'

Sbabbariiii imo a provare... ;)

Grazie :p

keeper83
23-05-2003, 20:29
..... :muro: :muro: :muro: :muro: :muro: :muro: :muro: :muro:



infatti era quel maledetto \r\n ..... lo sapevo che era una *censured* ....

Grazie almeno questo problema risolto ora vedo se farci altre cose se ho bisogno ti assillo ancora Grazie mille :D

cionci
24-05-2003, 09:30
Originally posted by "keeper83"

"\0" e '\0' dovrebbe essere la stessa cosa no? solo che con il secondo si piglia un solo carattere.... o no?
Ma una stringa come puoi assegnarla ad un carattere ? Un carattere ad un carattere invece va bene...

Quindi ora il browser te la vede l'immagine ?

keeper83
24-05-2003, 17:46
beh pero se metti in un char un unico elemento di una stringa..... vabb un pasticcio :p

Si ora mi vede tutto .. pero riesco a inviare solo .. mmm 2 immagini e poi come se non mi aspettasse piu richieste.....

devo vedere cosa pu essere... so solo che subito mi inviava UNA sola immagine poi ho messo un aCapo alla fine dell'invio del file e ora me ne invia due....

e basta... boh? ....

keeper83
27-05-2003, 10:01
C'e' un comando simile alla fork in windows? o un algoritmo per ricevere piu richieste dalla stessa porta?

cionci
27-05-2003, 14:23
Ci sono i thread in Windows...
L'API da usare CreateThread...ovviamente non portabile...

Riguardo a gestire pi socket con lo stesso thread...si pu fare benissimo... Basta gestire le send e le receive in maniera non bloccante...certo non una cosa semplice...

keeper83
29-05-2003, 11:07
Ciao sto ancora qua -___-"

Alla fine del protocollo inviata la testata e il file ci vogliono un certo n spazi????

Mi succede che mi invia la pagina, 2 immagini e poi si blocca...

Per far arrivare tutta la pagina devo premere alcune volte "VAI" in Ie e dopo due o tre volte arriva tutto ... cosa puo causare questo??

ho provato a farci fare uno.. due .. piu spazi alla fine del processo di invio solo che ho risolto appunto che mi manda 2 o tre immagini invece di una sola...

cionci
29-05-2003, 19:25
Sinceramente non lo so... Credo che al limite ci voglia un \r\n..

keeper83
29-05-2003, 22:29
Sto testando e.... suppongo che sia questione di Compilatore ora...

io usavo un GCC che il JFE della Massey university .... (fico 2 MB di compilatore)

ora sto provando col Cygwin .. emulatore Unix e gia funziona pero mi da noie con alcuni percorsi di file.....

credo che prover col Visual C++ tra poco -_-" anche se non ho dimestichezza....

hai qualche consiglio in quanto a compilatori??? :D

cionci
30-05-2003, 00:55
mingw...IMHO il miglior porting per Win32 di GCC...

Se vuoi anche un IDE: www.bloodshed.net