Другие ответы нацелены, но есть еще одна важная вещь, которую следует учитывать: структура sockaddr меньше, чем структура sockaddr_in6, необходимая для IPv6. Я портировал код, который имел это:
struct sockaddr salocal;
struct sockaddr_in * s_in = (struct sockaddr_in *) &salocal;
Замена второй строки на:
struct sockaddr_in6 * s_in6 = (struct sockaddr_in6 *) &salocal;
приводит к проблемам, потому что, хотя sockaddr_in
подходит для sockaddr
, sockaddr_in6
нет! Однако sockaddr_storage
достаточно большой, чтобы обрабатывать как IPv4, так и IPv6.
Вместо этого переключитесь на что-то вроде:
struct sockaddr_storage salocal;
struct sockaddr_in6 * s_in6 = (struct sockaddr_in6 *) &salocal;
и затем при вызове таких методов, как bind, приведите к (struct sockaddr *)
.