17 mai 2010

Protocolul HTTP

HTTP (HyperText Transfer Protocol - protocol pentru transfer de hipertext) este protocolul standard folosit in Web. HTTP este un protocol ASCII simplu. O interactiune HTTP consta dintr-o cerere de tip text, urmata de un raspuns care consta in fisierul transferat (ca mesaj în format standard MIME). Se poate spune ca protocolul HTTP este format din multimea cererilor (uzual GET, POST) de la programele de navigare catre servere si din multimea raspunsurilor trimise de acestea (antetele si corpurile mesajelor sunt asemanatoare cu cele din standardul MIME).
HTTP cunoaste mai multe versiuni succesive si este in continua evolutie; ultimele versiuni de MIME sunt foarte flexibile, avand o deschidere pentru viitoare aplicatii obiectuale.
HTTP este utilizat de catre navigatoare, dar ar putea fi folosit si de catre o persoana aflata la un terminal pentru a "discuta" direct cu un server Web, folosind o conectare TCP (de exemplu, prin programul telnet).

Programul urmator se conecteaza la adresa IP a unui server (de exemplu google) si citeste de la consola un cuvant, pe care il trimite serverului, iar fluxul de informatii care rezulta (din cautare de exemplu) este transferat intr-un fisier numit rezultat.html. Cererea folosita este GET.

#include "sys/socket.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
#include "sys/types.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "errno.h"

#define HTTP_PORT 80
#define MAXLEN 500000

ssize_t Readline (int sockd, void *vptr, size_t maxlen) {
ssize_t n, rc;
char c, *buffer;
buffer = vptr;

for ( n = 1; n<=maxlen-1; n++ ) {
if ( (rc = read(sockd, &c, 1)) == 1 ) {
*buffer++ = c;
if ( c == '\n' )
break;
}
else if ( rc == 0 ) {
if ( n == 1 )
return 0;
else
break;
}
else {
if ( errno == EINTR )
continue;
return -1;
}
}
*buffer = 0;
return n;
}


void send_command (FILE *g, int sockfd, char sendbuf[]) {
char recvbuf[MAXLEN];
int nbytes;
char CRLF[3];

CRLF[0] = 13; CRLF[1] = 10; CRLF[2] = 0;
strcat(sendbuf, CRLF);
write(sockfd, sendbuf, strlen(sendbuf));
nbytes = Readline (sockfd, recvbuf, MAXLEN - 1);
recvbuf[nbytes] = 0;
fprintf(g,"%s", recvbuf);
}

int main(int argc, char **argv) {
int sockfd;
int port = HTTP_PORT;
struct sockaddr_in servaddr;
char server_ip[15];
char sendbuf[MAXLEN];
char recvbuf[MAXLEN];

if (argc != 2) {
printf("Utilizare: ./send_msg adresa_server");
exit(-1);
}
strcpy(server_ip, argv[1]);

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("Eroare la creare socket.\n");
exit(-1);
}

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);

if (inet_aton(server_ip, &servaddr.sin_addr) <= 0 ) {
printf("Adresa IP invalida.\n");
exit(-1);
}

if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {
printf("Eroare la conectare\n");
exit(-1);
}

char word[30];
scanf("%s", word);
FILE * g = fopen("rezultat.html","w");

char *c = (char*)malloc(100*sizeof(char));
c = strcat(c,"GET /search?q=");
c = strcat(c, word);
c = strcat(c, " HTTP/1.0\n");

printf("%s\n",c);
sprintf(sendbuf, "%s", c);
while(1)
send_command(g,sockfd, sendbuf);

close(sockfd);
}

Niciun comentariu: