es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer una solicitud GET a un servidor web con una dirección IPv6, se necesita usar AF_INET6 en lugar de AF_INET en la función socket para crear un socket IPv6. Además, se necesita actualizar la estructura serv_addr para que sea del tipo sockaddr_in6 en lugar de sockaddr_in.

    Aquí está el código modificado:

    int portno = 825;
    const char *address = "2a02:842a:86d1:d001:26dd:8d7a:8202:d9a3";
    WSADATA wsa;
    SOCKET sockfd;
    char message[4096] = "GET /page/index.php?data=somedata 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 addrinfo *result = NULL;
    struct addrinfo hints = { 0 };
    struct sockaddr_in6 *serv_addr;
    int bytes, sent, received, total;
    char response[4096];
    int iResult = WSAStartup(MAKEWORD(2,2),&wsa);
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    if (getaddrinfo(address, NULL, &hints, &result) != 0) {
        printf("getaddrinfo failed with error\n");
        WSACleanup();
        return 1;
    }
    sockfd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    serv_addr = (struct sockaddr_in6*)result->ai_addr;
    serv_addr->sin6_flowinfo = 0;
    serv_addr->sin6_scope_id = 0;
    serv_addr->sin6_port = htons(portno);
    connect(sockfd, (struct sockaddr*)serv_addr, sizeof(*serv_addr));
    

    Estas modificaciones deberían permitir al código establecer una conexión IPv6.

Comments are closed.