When using accept()
or getpeername()
, the sockaddr_storage
always has 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;
}
I feel like its something to do with the creation:
s = socket(AF_INET6, SOCK_STREAM, 0);
or the bind
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) {
How can I get the ss_family
corrected, or tell another way what kind of IP it is?