Condividi:        

HTTP client in C Linux

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

HTTP client in C Linux

Postdi Ciao3 » 28/05/11 01:31

Salve a tutti,
sono alle prime armi con la programmazione di rete e stavo dando un'occhiata per la costruzione di un http client in ambiente C Linux. Googlando un po' ho visto che praticamente tutte le realizzazioni fanno uso di questa funzione:
Codice: Seleziona tutto
char *build_query(char *host, char *page)
{
        char *query, *pgindex = page;
        char *tpl = "GET /%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n";
       
        if (*pgindex == '/')
                pgindex++;
       
        query = (char *) malloc(strlen(host)+strlen(pgindex)+
                        strlen(USERAGENT)+strlen(tpl)-5);
        sprintf(query, tpl, pgindex, host, USERAGENT);
        return query;
}
domande:
1) tpl è un puntatore alla stringa che segue ma non ne ho capito l'utilità; inoltre i realtivi %s che "valore" assumono?
2) non ho capito il commento sul -5;
3) non ho capito perché questo stesso numero viene sottratto nell'espressione interna alla malloc
4) a cosa serve mandare avanti il puntatore pgindex di un solo passo [presumibilmente infatti dopo lo slash il carattere sarà nel 99% dei casi diverso dallo slash stesso]?

se mi poteste aiutare ve ne sarei grato

Buona giornata
Ciao3
Utente Junior
 
Post: 40
Iscritto il: 31/07/09 15:05

Sponsor
 

Re: HTTP client in C Linux

Postdi zello » 07/06/11 10:08

1) tpl è un puntatore alla stringa che segue ma non ne ho capito l'utilità; inoltre i realtivi %s che "valore" assumono?

E' la formattazione della stringa: %s prende il valore della stringa che segue. In pratica, usando printf (che è analogo, ma manda l'output a video, e non su una stringa di destinazione):
Codice: Seleziona tutto
char* s = "Ciao %s\n";
char* arg = "zello";
printf(s, arg);

Stampa 'Ciao zello'.
2) non ho capito il commento sul -5;

Io non ho capito di quale commento parli...
3) non ho capito perché questo stesso numero viene sottratto nell'espressione interna alla malloc

Questa è sottile.
La sprintf sostituisce tutti i '%s' con le stringhe che seguono come argomenti, come già detto, e piazza il risultato nella stringa query.
La malloc deve allocare lo spazio sufficiente per contenere la stringa risultante.
La stringa dovrà essere lunga come la somma di tutte le stringhe, più uno (per lo zero terminatore), meno tutti gli %s che andranno sostituiti (e sono 6). 1-6=-5. Capito?
4) a cosa serve mandare avanti il puntatore pgindex di un solo passo [presumibilmente infatti dopo lo slash il carattere sarà nel 99% dei casi diverso dallo slash stesso]?

La query già contiene lo slash (GET /%s HTTP ecc ecc), quindi se pgindex comincia con slash passeresti una query con due slash di fila, e dunque scorretta.
Se pgindex comincia con uno slash, dunque, bisogna toglierlo; il modo più efficiente è avanzare il puntatore al carattere successivo.

Ciao.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: HTTP client in C Linux

Postdi Ciao3 » 03/10/12 10:47

@zello ti dovevo dire grazie da un po' di tempo, il fatto è che su questo programma mi ci sono rimesso da poco tempo... grazie per la risposta, appena ho un minuto la guardo e ti faccio sapere se l'ho capita per bene

Ancora grazie mille e buona giornata!!!
Ciao3
Utente Junior
 
Post: 40
Iscritto il: 31/07/09 15:05

Re: HTTP client in C Linux

Postdi Ciao3 » 28/10/12 17:49

allora zello ho riletto le tue risposte e sono chiare [il commento col -5 è perché stavo per postare una soluzione analoga a questa dove c'era un commento]... mi rimane però un dubbio: una volta effettuato il -5 la stringa query che allochiamo può ospitare un numero di caratteri dato da [strlen(host)+strlen(pgindex)+strlen(USERAGENT)+strlen(tpl)-5] ma tpl al posto dei %s inserirà ben più di quei 6 caratteri corrispondenti ai tre %s... quindi quando andiamo a stampare dentro query esplicitando l'host, la pagina e l'useragent non si ha una stringa query troppo piccola? come mai non c'è errore? nell'esempio del printf che hai postato lo capisco, la stampa è su stdout ma nel caso della stringa di lunghezza predefinita no

grazie ancora
Ciao3
Utente Junior
 
Post: 40
Iscritto il: 31/07/09 15:05


Torna a Programmazione


Topic correlati a "HTTP client in C Linux":

UMS SINGLE client
Autore: nikita75
Forum: Software Windows
Risposte: 1
stampante Ricoh per Linux
Autore: pol133
Forum: Software Linux
Risposte: 3

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti