C/Visual C - Hacer un GET a un HTTPS en C

 
Vista:
sin imagen de perfil
Val: 2
Ha disminuido su posición en 18 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Hacer un GET a un HTTPS en C

Publicado por Francisco Javier (1 intervención) el 22/08/2020 12:21:29
Tengo el siguiente código que me sirve para ver u obtener una página a una dirección http, pero si la dirección es https, me da el siguiente mensaje:

Connecting...
Connected!
GET Sent...
recv()'d 434 bytes of data in buf
HTTP/1.1 301 Moved Permanently
Date: Sat, 22 Aug 2020 10:15:08 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Sat, 22 Aug 2020 11:15:08 GMT
Location: https://ladireccionX.com/xx/xx
etc...


El codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
int main(void) {
    //Stream sockets and rcv()
 
    struct addrinfo hints, *res;
    int sockfd;
 
    char buf[2056];
    int byte_count;
 
    //get host info, make socket and connect it
    memset(&hints, 0,sizeof hints);
    hints.ai_family=AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    getaddrinfo("ladireccionX.com","80", &hints, &res);
    sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol);
    printf("Connecting...\n");
    connect(sockfd,res->ai_addr,res->ai_addrlen);
    printf("Connected!\n");
    char *header = "GET /xx/xxxx HTTP/1.1\r\nHost: ladireccionX.com\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)\r\nConnection: keep-alive\r\n\r\n";
    send(sockfd,header,strlen(header),0);
    printf("GET Sent...\n");
    //all right ! now that we're connected, we can receive some data!
    byte_count = recv(sockfd,buf,sizeof buf,0);
    printf("recv()'d %d bytes of data in buf\n",byte_count);
    printf("%s",buf);
    return 0;
}

Que tendría que hacer para recibir la pagina de la dirección https ?

Gracias, y buen día a tod@s
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Hacer un GET a un HTTPS en C

Publicado por Nacho (61 intervenciones) el 22/08/2020 15:53:22
Claro, el http te manda la página en formato de texto plano. Https lo manda cifrado en paquetes que tienes que ir descifrando. Quizá te valga con aplicar el protocolo tls a lo que vas recibiendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Sergio
Val: 6
Ha aumentado su posición en 126 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Hacer un GET a un HTTPS en C

Publicado por Sergio (2 intervenciones) el 06/09/2020 18:28:17
Hola, te paso un ejemplo de cliente servidor. Espero te ayude. Saludos!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
 * implementación de sockets para programa cliente
 *
 * */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 
int main()
{
	struct sockaddr_in client; // struct para socket de cliente
	struct hostent *server; // puntero para almacenar los datos del server
	int port, sockcfd; // enteros para conexion
	char buffer[100]; // buffer para mensaje
 
	server = gethostbyname("localhost"); //obtener ip del server
	if(server == NULL){
		printf("Error de host\n");
		return 1;
	}
 
	// rellenar la estructura para connect
	client.sin_family = AF_INET;
	client.sin_addr = *((struct in_addr *)server->h_addr);
	client.sin_port = htons(1080);
 
	// abrir el socket cliente
	sockcfd = socket(AF_INET, SOCK_STREAM, 0);
 
	// conectarse al host remoto
	if(connect(sockcfd, (struct sockaddr *) &client, sizeof(client)) < 0){
		perror("Error conectando con el host destino\n");
		close(sockcfd);
		return 1;
	}
 
	printf("Conectando con %s %d\n", inet_ntoa(client.sin_addr), htons(client.sin_port));
	printf("Escribe un mensaje:\n");
	fgets(buffer, 100, stdin);
	send(sockcfd, buffer, 100, 0);
	bzero(buffer, 100);
	recv(sockcfd, buffer, 100, 0);
	printf("%s", buffer);
	close(sockcfd);
	return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 *  implementacion de sockets para el programa servidor
 *
 * */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
 
int main()
{
	struct sockaddr_in server, client;
	int socksfd, sockcfd, port;
	socklen_t lenc = sizeof(client);
	char buffer[100];
 
	// rellenar la estructua para bind
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = INADDR_ANY;
	server.sin_port = htons(1080);
 
	// abrir el socket para server
	socksfd = socket(AF_INET, SOCK_STREAM, 0); // tcp
 
	/********** bind *******************/
	if(bind(socksfd, (struct sockaddr *)&server, sizeof(server)) < 0){
		printf("Error al asociar el puerto a la conexión\n");
		close(socksfd);
	}
 
	/********* listen *****************/
	listen(socksfd, 2);
	printf("Escuchando en el puerto %d\n", ntohs(server.sin_port));
 
	/********* accept ****************/
	sockcfd = accept(socksfd, (struct sockaddr *)&client, &lenc);
	if(sockcfd < 0){
		perror("Error al aceptar conexión\n");
		close(socksfd);
		return 1;
	}
 
	printf("Conectando con ip: %s puerto: %d\n", inet_ntoa(client.sin_addr), client.sin_port);
 
	/********* recibir datos del clinete *********/
	if(recv(sockcfd, buffer, 100, 0) < 0){
		perror("Error\n");
		close(socksfd);
		return 1;
	}
	else{
		printf("%s", buffer);
		bzero((char *)&buffer, sizeof(buffer));
		send(sockcfd, buffer, 100, 0);
	}
	close(socksfd);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar