【发布时间】:2017-09-17 19:13:38
【问题描述】:
Apple 需要 IPv6 兼容性。似乎有点为时过早,但我想有人必须强制它被广泛采用。
我的一个客户有一些遗留代码,由于这种不兼容性,这些代码将不再被批准用于 App Store。软件不是我自己写的,特别是没接触过这部分代码。在低级 C 网络方面,我并不是一个忍者。
我告诉客户,部分问题在于他们有一个仅支持 IPv4 的服务器,并且让我们将 IPv4 地址硬编码到该服务器。我将 IPv4 地址更新为域名,并告诉他们他们的服务器必须支持 IPv6。因此,他们将它们全部移动,并在进行任何测试之前拨动了开关。几天前我收到通知,他们在商店里的所有软件都不再工作了。这就是我们所处的困境。
这是我可以使用一些帮助的潜在许多问题之一。
不仅连接到端口的服务器不响应 IPv6,而且使用的一些较低级别的 API 不兼容。
我遇到的第一件事就是gethostbyname()的使用。显然这不支持 IPv6。我一直在尝试使用 getaddrinfo() 修复它,但我的 sockaddr 并不完全相同。
我可以看到的第二个问题是显然我需要使用AF_UNSPEC 而不是AF_INET。所以我试图通过以下方式打开一个套接字:
int sockfd = socket(AF_UNSPEC, SOCK_STREAM, 0);
我总是得到-1。
如果我使用AF_INET 打开袜子,我会走得更远,但是我遇到了这个问题:
otherAddr sockaddr * 0x618000220680 0x0000618000220680
sa_len __uint8_t '\x1c'
sa_family sa_family_t '\x1e'
sa_data char [14] "\x13\x88"
otherAddrCast sockaddr * 0x7000052d3c28 0x00007000052d3c28
sa_len __uint8_t '\0'
sa_family sa_family_t '\0'
sa_data char [14] "\x13\x88\"Ԛ\\"
所以有些sa_data 是一样的。如果我不将sockaddr_in 转换为struct sockaddr*,那么sa_data 是一样的。
问题是我不知道这大部分是什么意思。帮忙?
编辑:这是我的代码。假设我只得到 1 个地址(因为我是)
struct hostent* server = gethostbyname([_hostname UTF8String]);
struct addrinfo *ai;
struct addrinfo hints;
memset(&hints, 0x00, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
NSString* portString = [NSString stringWithFormat:@"%d", _port];
getaddrinfo([_hostname UTF8String], [portString cStringUsingEncoding:kCFStringEncodingASCII] , &hints, &ai);
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
bcopy(server->h_addr, &addr.sin_addr.s_addr, server->h_length);
addr.sin_port = htons(_port);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
_addr = (struct sockaddr*)&addr;
int status = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
int status2 = connect(socket(ai->ai_family,ai->ai_socktype,0), ai->ai_addr, ai->ai_addrlen);
【问题讨论】:
-
您可能需要查找 IPv6 套接字教程。对于stackoverflow,这个问题可能有点宽泛。
-
“似乎有点为时过早” - 是的,只是 IPv4 的地址用完了,而 IPv6 标准化的时间只有 20 年。绝对过早...
-
我知道标准已经存在,不幸的是这还不够。许多消费者 ISP(大多数应用程序用户)不完全支持 IPv6。这给试图在没有合理测试路径的情况下支持它的人们带来了相当大的挑战。
标签: objective-c c sockets