Requete en c / socket

ttatanepvp123 Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
bonjour je travaille sur un projet en c

et j'ai besoin d'aide je doit récupérè un mot sur une page comme selle si : http://essais.lionzone.fr/

a remarquer qu il ni a pas de balise sur cette page

je veux juste récupéré le mot depuis le programme merci

sous Windows

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut ttatanepvp123,

Avec les sockets, tu vas récupérer le contenu de la réponse http, avec l'entête http, un saut de ligne vide et le contenu de la page.

Pour récupérer ton "mot", il faudra passer l'entête et le saut de ligne vide, pour ne t'occuper que de ce qui suit.

Donc, avec un buffer assez grand pour récupérer le contenu de la page qui t'intéresse en un recv, tu peux sauter les headers en utilisant strstr() et en recherchant "\r\n\r\n".

Dal
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
comme cela :

$ cat 35192101.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define MEM_BLOCK_SIZE 4096

int main(void)
{
	int sockfd, portno, n;
	struct sockaddr_in serv_addr;
	struct hostent *server;

	char buffer[MEM_BLOCK_SIZE];
	char *host = "essais.lionzone.fr";
	char *p = NULL;

	portno = 80;
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd < 0) 
		perror("ERROR opening socket");
	server = gethostbyname(host);
	if (server == NULL) {
		fprintf(stderr,"ERROR, no such host\n");
		exit(0);
	}
	memset((char *) &serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	memcpy((char *)&serv_addr.sin_addr.s_addr,
			(char *)server->h_addr, 
			server->h_length);
	serv_addr.sin_port = htons(portno);
	if (connect(sockfd,(struct sockaddr *) &serv_addr,
				sizeof(serv_addr)) < 0) 
		perror("ERROR connecting");
	const char * request = "GET / HTTP/1.0\r\nHost: essais.lionzone.fr\r\nConnection: close\r\n\r\n";
	n = write(sockfd,request,strlen(request));
	if (n < 0) perror("ERROR writing to socket");

	/* the data to be found plus the http header
	 * shall be less than MEM_BLOCK_SIZE - 1
	 */
	memset(buffer, 0, MEM_BLOCK_SIZE);
	n = recv(sockfd,buffer, MEM_BLOCK_SIZE - 1, 0);
	if (n < 0) {
		perror("ERROR reading from socket");
		return 0;
	}
	if (n == 0) {
		perror("ERROR no data");
		return 0;
	}
	printf("number of bytes received: %d\n", n);
	printf("full response received:\n%s\n",buffer);

	p = strstr(buffer, "\r\n\r\n");
	if (p) {
		p = p + 4;	/* move after the 4 chars */
		printf("what is after the http header is:"
				" \n------\n%s\n------\n", p);
	}
	else {
		perror("ERROR empty line ending headers not found");
	}

	close(sockfd);
	return 0;
}

$ gcc -Wall 35192101.c
$ ./a.out
number of bytes received: 200
full response received:
HTTP/1.1 200 OK
Server: o2switch PowerBoost
Date: Fri, 09 Feb 2018 17:14:37 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.33

tatane

what is after the http header is:
------
tatane

------
$


Dal
0