【发布时间】:2020-04-17 17:23:42
【问题描述】:
当使用accept() 或getpeername() 时,sockaddr_storage 总是有ss_family=AF_INET6:
struct sockaddr_storage address = {0};
socklen_t sockaddrlen = sizeof(address);
int client = accept(sock, (struct sockaddr*)(&address), &sockaddrlen);
if (client < 0) {
perror("Unable to accept");
exit(EXIT_FAILURE);
}
if( address.ss_family==AF_INET6 ){
std::cout << "IPv6" << std::endl;
} else {
std::cout << "IPv4" << std::endl;
}
我觉得它与创作有关:
s = socket(AF_INET6, SOCK_STREAM, 0);
或绑定
struct sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr));
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(port);
addr.sin6_addr = in6addr_any;
if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
我怎样才能更正ss_family,或者以其他方式告诉它是什么类型的IP?
【问题讨论】:
-
您将需要更复杂的检测来查看 IPv6 地址是否是 IPv4 映射地址,例如 ::ffff:1.2.3.4
-
贴出的代码是C++,不是C。请更正问题标签
-
@user3629249 唯一的部分 c++ 是 cout,套接字部分是 c,这就是我一直在用谷歌搜索“c 套接字问题”如果我谷歌“c++ 套接字问题”它显示的东西不相关所以我认为 C 是正确的标签,所以其他人可以找到它。
-
文件中的任何部分代码为 C++ 都会导致使用 C++ 编译器。都必须是 C。
标签: c sockets networking