Enviar una solicitud GET en C a un servidor web de IPv6 en Windows.
Estoy intentando hacer una solicitud simple de GET
a un servidor web que tiene una dirección IPv6, pero no funciona. Mi código tiene que estar disponible en Windows, por lo que uso las bibliotecas de Windows, por ejemplo:
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#include <windows.h>
#include <winuser.h>
#include <string.h>
Aquí está la parte del código que establece la conexión:
int portno = 825;
//sí, número de puerto extraño...
const char *adress = "[2a02:842a:86d1:d001:26dd:8d7a:8202:d9a3]";
WSADATA wsa;
SOCKET sockfd;
char message[4096] = "GET //pagina//index.php?datos=algunosdatos HTTP/1.1\r\nHost: [2a02:842a:86d1:d001:26dd:8d7a:8202:d9a3]\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n\r\n";
struct hostent *server;
struct sockaddr_in6 serv_addr;
int bytes, sent, received, total;
char response[4096];
int iResult = WSAStartup(MAKEWORD(2,2),&wsa);
sockfd = socket(AF_INET6 , SOCK_STREAM , 0 );
//mientras estaba depurando, noté que esta línea no funciona
server = gethostbyname(adress);
memset(&serv_addr,0,sizeof(serv_addr));
printf("1\n");
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
Si alguien sabe cómo cambiar este código para permitir conexiones IPv6, por favor dígame 🙂
davy.ai
Para hacer una solicitud
GET
a un servidor web con una dirección IPv6, se necesita usarAF_INET6
en lugar deAF_INET
en la funciónsocket
para crear un socket IPv6. Además, se necesita actualizar la estructuraserv_addr
para que sea del tiposockaddr_in6
en lugar desockaddr_in
.Aquí está el código modificado:
Estas modificaciones deberían permitir al código establecer una conexión IPv6.