c - SCTP 多宿主未按预期工作

标签 c sctp

我在 SCTP 中作为服务器端实现多宿主时遇到了问题。服务器有 2 个正在监听的 IP。 我快到了,但有 2 个问题:

  1. 第一个 IP 返回 INIT-ACK, header 内有 2 个不同的 IP,但另一个 IP 在 INIT-ACK header 中返回两次相同的 IP。
  2. 似乎我不支持 100% 的多宿主,例如,如果其中一个链路出现故障,我看不到故障转移。

所以我不知道除了带有选项 SCTP_SOCKOPT_BINDX_ADD 的 setsockopt 之外我还需要其他任何东西(也许是 SCTP_PRIMARY_ADDR?)或者我的实现有什么问题。

以下是代码,我输入这段代码两次,第一次绑定(bind)然后保存套接字和第一个地址,第二次再次绑定(bind)(针对第二个 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++;

谢谢!!!

最佳答案

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的实现。你看到所有路径上的心跳了吗?你在哪个盒子上测试?

关于c - SCTP 多宿主未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219268/

相关文章:

c++ - 我可以在同一个套接字描述符上调用 bind() 然后调用 connect() 吗?

c - 包含未使用的 header 是否对代码有任何影响?

c - 使用已经处于 TIME_WAIT 状态的选项 SO_REUSEADDR 重用端口是个好主意吗?

scapy - 使用 Scapy 制作 S1AP 数据包

c - 使用 sem_open 初始化信号量

c - 我的推送函数总是将最新的元素推送到堆栈的每个值上

c - 函数指针数组,传递数组中定义的值

sockets - 并发sctp读取线程和非阻塞模式

linux - 我在 Redhat 上安装 libsctp 时遇到问题

c - 如何使用C编程使SCTP校验和非零