我正在尝试向具有IPv6地址的and服务器发出一个简单的GET请求,但它不起作用。我的代码必须在Windows上可用,所以我使用Windows库,例如
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#include <windows.h>
#include <winuser.h>
#include <string.h>下面是建立连接的代码部分:
int portno = 825;
//yes, strange port number...
const char *adress = "[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 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 );
//while debugging i noticed that this line does not work
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));如果有人知道如何更改此代码以允许IPv6连接,请告诉我:)
发布于 2021-11-25 23:21:52
您对gethostbyname()的调用不可能起作用,因为当您以URI表示法([addr])提供IPv6地址时,此函数仅适用于IPv4地址或主机名。此外,gethostbyname()已经过时,不应该在新代码中使用。
因为您已经有了IPv6地址,所以不需要执行查找。您可以使用getaddrinfo(),但最好通过简单得多的inet_pton()将其转换为二进制形式。请记住,您需要删除封闭的[]括号,因为它们只用于URI,而不用于文字地址。
下面是一个例子:
const char *address = "2a02:842a:86d1:d001:26dd:8d7a:8202:d9a3";
if (inet_pton(AF_INET6, address, &serv_addr.sin6_addr.s6_addr) != 1) {
// invalid address, handle the error somehow
}另外,请注意正确的sockaddr_in6具有以下字段(请参阅man 7 ipv6):
struct sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* port number */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */
};
struct in6_addr {
unsigned char s6_addr[16]; /* IPv6 address */
};当您使用sin_addr、sin_family等时,就好像它是一个sockaddr_in结构。相反,您需要的是:
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_port = htons(portno);https://stackoverflow.com/questions/70118133
复制相似问题