Menu

Requete en c / socket

ttatanepvp123 1 Messages postés jeudi 8 février 2018Date d'inscription 9 février 2018 Dernière intervention - 9 févr. 2018 à 03:47 - Dernière réponse : [Dal] 4607 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention
- 9 févr. 2018 à 18:16
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
Afficher la suite 

Votre réponse

2 réponses

[Dal] 4607 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - Modifié par [Dal] le 9/02/2018 à 12:51
0
Merci
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
[Dal] 4607 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 9 févr. 2018 à 18:16
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
Commenter la réponse de [Dal]