首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C语言将GET请求发送到windows上的IPv6 web服务器

使用C语言将GET请求发送到windows上的IPv6 web服务器
EN

Stack Overflow用户
提问于 2021-11-25 23:08:47
回答 1查看 65关注 0票数 0

我正在尝试向具有IPv6地址的and服务器发出一个简单的GET请求,但它不起作用。我的代码必须在Windows上可用,所以我使用Windows库,例如

代码语言:javascript
复制
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#include <windows.h>
#include <winuser.h>
#include <string.h>

下面是建立连接的代码部分:

代码语言:javascript
复制
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连接,请告诉我:)

EN

回答 1

Stack Overflow用户

发布于 2021-11-25 23:21:52

您对gethostbyname()的调用不可能起作用,因为当您以URI表示法([addr])提供IPv6地址时,此函数仅适用于IPv4地址或主机名。此外,gethostbyname()已经过时,不应该在新代码中使用。

因为您已经有了IPv6地址,所以不需要执行查找。您可以使用getaddrinfo(),但最好通过简单得多的inet_pton()将其转换为二进制形式。请记住,您需要删除封闭的[]括号,因为它们只用于URI,而不用于文字地址。

下面是一个例子:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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_addrsin_family等时,就好像它是一个sockaddr_in结构。相反,您需要的是:

代码语言:javascript
复制
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_port = htons(portno);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70118133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档