gpt4 book ai didi

c++ - winsock 怪异 (c++)

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:21 26 4
gpt4 key购买 nike

我正在尝试实现一个名为“inet_pton”的函数,它将 IPv4 或 IPv6 的字符串表示形式(如“66.102.1.147”[google])转换为二进制网络字节有序形式。这是我的代码的相关部分:

#if defined WIN32
int inet_pton (int af, const char *src, void *dst)

{
const void *data;
size_t len;
struct addrinfo hints, *res;

hints.ai_family = af;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST;

if (getaddrinfo (src, NULL, &hints, &res))
{
std::cout << "ERROR : inet_pton() in " << __FILE__ << " at line " << __LINE__ << std::endl;
std::cout << " : getaddrinfo() failed to get IP address info for \"" << src << "\"" << std::endl;
return 0;
}
...

所以 src 是传入的 IP 字符串。但是,我总是会收到这样的错误

getaddrinfo() 无法获取“66.102.1.147”的 IP 地址信息

有winsock经验的可以评论一下吗?我也尝试了另一种方法,函数

WSAStringToAddress ((LPTSTR)src, af, NULL, (LPSOCKADDR) &sa, &address_length)

但它总是返回错误代码 WSAEINVAL,表示无效的 IP 字符串。这对我来说毫无意义。我使用 VS2005 作为我的 IDE。

最佳答案

好吧,一开始您需要一个以 UDP 作为协议(protocol)的流套接字,而这不会发生。

尝试:

hints.ai_family   = af;
hints.ai_socktype = 0;
hints.ai_protocol = 0;
hints.ai_flags = AI_NUMERICHOST;

并且首先将其 memset 为零,因为它有您未设置的额外成员...

同样在我的代码中,当我没有端口或服务时,我会为端口或服务传递一个空字符串,而不是 null。文档似乎没有指定当您没有值时该怎么做;但无论哪种方式,空字符串都适合我。

哦,在这些情况下,了解 WSAGetLastError() 返回的值会很有用...

关于c++ - winsock 怪异 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/547214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com