我想在本地主机上创建服务器,使用本地主机的IPv6映射的IPv4地址,但得到errno99。我不确定在这里做错了什么:
#define IPv6_MAPPED_IPv4_LOCAL_ADDRESS "::FFFF:127.0.0.1" //localhost
#define PORT 12345
static int server()
{
int fd, v6only;
struct sockaddr_in6 addr6;
v6only = 0;
/* IPv6 TCP socket */
fd = socket(AF_INET6, SOCK_STREAM, 0);
if (fd == -1) {
fprintf(stderr, "Creating tcp socket failed \n");
return -1;
}
memset(&addr6, 0, sizeof(struct sockaddr_in6));
addr6.sin6_family = AF_INET6;
memcpy(addr6.sin6_addr.s6_addr, IPv6_MAPPED_IPv4_LOCAL_ADDRESS, sizeof(struct in6_addr));
addr6.sin6_port = htons(PORT);
addr6.sin6_scope_id = 0;
/* use setsockopt() to enable dual stack on the server */
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v6only, sizeof(v6only)) < 0) {
fprintf(stderr, "Setting IPV6_V6ONLY to 0 failed error %s \n", strerror(errno));
close(fd);
return -1;
}
/* bind server socket to the address */
if (bind(fd, (struct sockaddr *)&addr6, sizeof(struct sockaddr_in6)) < 0) {
fprintf(stderr, "Binding socket failed error %s\n", strerror(errno));
close(fd);
return -1;
}
}
服务器因错误而失败 Binding socket failed error Cannot assign requested address
addr6.sin6_addr.s6_addr
不是以字符串形式而是以二进制格式表示的地址。您需要使用将字符串转换为此二进制格式inet_pton
。
如
inet_pton(AF_INET6, IPv6_MAPPED_IPv4_LOCAL_ADDRESS, &addr6.sin6_addr.s6_addr);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句