Использование `sendto ()` на сокете IPv6 для отправки на адрес IPv4 - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть приложение C ++, которое использует тот же сокет IPv6 UDP для отправки адресатам IPv6 или IPv4.

sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
dest_addr.sin6_family = AF_INET;
dest_addr.sin6_port = htons(dest_port);
inet_pton ("192.168.1.33",  &dest_addr.sin6_addr);
sendto (sockfd, message, strlen(message)+1, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));

В Linux это работает нормально, но во FreeBSD я получаю ошибку Address family not supported by protocol family при отправке на адреса IPv4.

Есть ли способ настроить FreeBSD, чтобы принять это? Может быть, похоже на ipv6_ipv4mapping="YES" для прослушивания клиентов IPv4?

1 Ответ

3 голосов
/ 11 ноября 2011

Вы создаете сокет IPv6, поэтому вам нужно использовать адреса IPv6. Однако если ваша ОС поддерживает сокеты с двумя стеками (т. Е. Изначально поддерживает как IPv4, так и IPv6 на одном сокете), то для отправки на IPv4-адрес используйте сопоставленный с IPv4 адрес IPv6 (если ОС позволяет это некоторые не делают). В противном случае вам придется использовать отдельные сокеты для IPv4 и IPv6.

...