Я столкнулся с проблемой реализации множественной адресации в SCTP на стороне сервера. У сервера есть 2 IP-адреса, которые он слушает. Я почти у цели, но есть 2 проблемы:
- Первый IP-адрес возвращает INIT-ACK с двумя разными IP-адресами внутри заголовка, как и должно быть, но другой IP-адрес дважды возвращает один и тот же IP-адрес в заголовке INIT-ACK.
- Похоже, я не поддерживаю 100% мульти-хоуминг, например, если одна из ссылок не работает, я не вижу отработки отказа.
Так что я не знаю, нужно ли мне кроме setsockopt с опцией SCTP_SOCKOPT_BINDX_ADD что-то еще (может быть SCTP_PRIMARY_ADDR?) или что не так в моей реализации.
Ниже приведен код, я ввожу этот код дважды, в первый раз я выполняю привязку, а затем сохраняю сокет и первый адрес, во второй раз снова связываю (для второго IP-адреса), а затем запускаю setsockopt для обоих адресов и сокетов.
bind(socket, &sock_addr.addr.sock_addr, sock_addr_len);
if(SHARED.num_used_entries_in_sockaddr_array == 0)
{
SHARED.saved_socket = socket;
SHARED.sockaddr_array[1] = sock_addr.addr.sock_addr;
}
else
{
SHARED.sockaddr_array[0] = sock_addr.addr.sock_addr;
}
if(SHARED.num_used_entries_in_sockaddr_array > 0)
{
sock_rc = setsockopt(SHARED.saved_socket,
IPPROTO_SCTP,
SCTP_SOCKOPT_BINDX_ADD,
(char*)SHARED.sockaddr_array,
sizeof(SCKOS_SOCK_ADDR));
sock_rc = setsockopt(socket,
IPPROTO_SCTP,
SCTP_SOCKOPT_BINDX_ADD,
(char*)SHARED.sockaddr_array,
sizeof(SCKOS_SOCK_ADDR));
}
SHARED.num_used_entries_in_sockaddr_array++;
Спасибо!!!