Множественная адресация SCTP не работает должным образом

Я столкнулся с проблемой реализации множественной адресации в SCTP на стороне сервера. У сервера есть 2 IP-адреса, которые он слушает. Я почти у цели, но есть 2 проблемы:

  1. Первый IP-адрес возвращает INIT-ACK с двумя разными IP-адресами внутри заголовка, как и должно быть, но другой IP-адрес дважды возвращает один и тот же IP-адрес в заголовке INIT-ACK.
  2. Похоже, я не поддерживаю 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++;

Спасибо!!!


person Oded Itzhaky    schedule 04.11.2012    source источник


Ответы (2)


SCTP_SOCKOPT_BINDX_ADD подходит для множественной адресации. в ваших кодах есть неиспользуемые строки.

  if(SHARED.num_used_entries_in_sockaddr_array  == 0)
  {
    bind(socket, &sock_addr.addr.sock_addr,  sock_addr_len);
  }
  else
  {
    sock_rc = setsockopt(socket,
                              IPPROTO_SCTP,
                              SCTP_SOCKOPT_BINDX_ADD,
                              (char*)sock_addr.addr.sock_addr,
                              sizeof(SCKOS_SOCK_ADDR));
    }enter code here

Вы можете обратиться к реализации linux sctp. Вы видели сердцебиение на всех дорожках? На какой коробке вы тестируете?

person cathrine    schedule 07.12.2012
comment
спасибо за ответ, в конце концов я использовал sctp_bindx, который намного проще реализовать - person Oded Itzhaky; 19.02.2013

спасибо за ответ, в конце концов я использовал sctp_bindx, который намного проще реализовать

person Oded Itzhaky    schedule 30.04.2017