Requete en c / socket

Fermé
ttatanepvp123 Messages postés 1 Date d'inscription jeudi 8 février 2018 Statut Membre Dernière intervention 9 février 2018 - 9 févr. 2018 à 03:47
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 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

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 9 févr. 2018 à 12:51
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
0