【发布时间】:2022-01-04 03:28:06
【问题描述】:
我正在尝试向具有 IPv6 地址的网络服务器发出简单的 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 连接,请告诉我 :)
【问题讨论】:
-
IPv6 地址符号一般不包括
[或]。 -
@Cheatah 见RFC 2732
-
@Bouloukaouze 附带说明,您的
GET请求格式不正确。//需要改为/。只有\需要在字符串文字中转义为\\。
标签: c sockets web ipv6 winsock2