1

サーバー側として SCTP にマルチホーミングを実装する際に問題に直面しています。サーバーには、リッスンしている 2 つの IP があります。私はほとんどそこにいますが、2つの問題があります:

  1. 最初の IP はヘッダー内に 2 つの異なる IP を含む INIT-ACK を返しますが、もう一方の IP は INIT-ACK ヘッダーで同じ IP を 2 回返します。
  2. マルチホーミングで 100% をサポートしていないようです。たとえば、リンクの 1 つがダウンしている場合、フェイルオーバーは見られません。

したがって、オプション SCTP_SOCKOPT_BINDX_ADD を指定した setsockopt を除いて、他に何か (おそらく SCTP_PRIMARY_ADDR?) が必要なのか、実装の何が問題なのかわかりません。

以下はコードです。このコードを 2 回入力します。1 回目はソケットと最初のアドレスをバインドして保存し、2 回目は (2 番目の 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++;

ありがとう!!!

4

2 に答える 2

1

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 実装を参照できます。すべてのパスでハートビートを確認しましたか? どのボックスでテストしますか?

于 2012-12-07T16:01:46.253 に答える