INET_PTON 函数的 IP 地址无效

问题描述 投票:0回答:1

我目前正在使用 Windows 操作系统并使用 C 进行编码。

我是套接字编程的完全初学者,并且下面的代码片段返回不需要的值。 (

MAXLINE
= 4096),并且我已定义
CTR_SECURITY...

const char* IPADDRESS = "142.250.79.46";

int sockFileDescriptor = 0, n;
int sendbytes = 0;
SOCKADDR_IN servaddr = { 0 };

char sendl[MAXLINE];
char recvl[MAXLINE];
memset(sendl, 0, MAXLINE);

WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);

if (0 > (sockFileDescriptor = socket(AF_INET, SOCK_STREAM, 0))) { 
    printf("no socket"); 
    exit(-1); 
}

memset((char*)&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(1337);

int a = InetPton(AF_INET, IPADDRESS, &servaddr.sin_addr.S_un.S_addr);
if (0 >= a) {
    printf("inetPton %d, returnV = %d", WSAGetLastError(), a);
    exit(-1);
}

if (0 > connect(sockFileDescriptor, (SOCKADDR*)&servaddr, sizeof(servaddr))) {
    printf("connect wrong %d", WSAGetLastError());
    exit(-1);
}
sprintf(sendl, "GET / HTTP/1.1\r\n\r\n");

sendbytes = strlen(sendl);
/*
if (_write(sockFileDescriptor, sendl, sendbytes) != sendbytes) {
    printf("error");
    exit(-1);
}*/

if (0 > send(sockFileDescriptor, sendl, strlen(sendl), 0)) {
    printf("sendGoneWrong");
    exit(-1);
}

memset(recvl, 0, MAXLINE);
while ((n = _read(sockFileDescriptor, recvl, MAXLINE - 1))>0) {
    printf("%s", recvl);
}
exit(0);

它返回

"inetPton 10022, returnV = 0"

我尝试过其他IP地址,但没有一个改变结果,让我相信我没有正确使用

InetPton()
功能。

顺便问一下,在

InetPton()
中,我应该使用
servAddr.sin_addr
还是
servaddr.sin_addr.S_un.S_addr

c windows winapi winsock winsock2
1个回答
0
投票

您可以替换所有这些:

memset((char*)&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(1337);

int a = InetPton(AF_INET, IPADDRESS, &servaddr.sin_addr.S_un.S_addr);
if (0 >= a) {
    printf("inetPton %d, returnV = %d", WSAGetLastError(), a);
    exit(-1);
}

有了这个:

ADDRINFOA *result = NULL;
ADDRINFOA hints = { 0 };
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_NUMERICHOST;
GetAddrInfoA(IPADDRESS, "1337", &hints, &result);

if (result != NULL) {
    memcpy(&servaddr, result->ai_addr, sizeof(servaddr));
    FreeAddrInfoA(result);
}
© www.soinside.com 2019 - 2024. All rights reserved.