我在 SCTP 中作为服务器端实现多宿主时遇到了问题。服务器有 2 个正在监听的 IP。我快到了,但有 2 个问题:
- 第一个 IP 返回 INIT-ACK, header 内有 2 个不同的 IP,但另一个 IP 在 INIT-ACK header 中返回两次相同的 IP。
- 似乎我不支持 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的实现。你看到所有路径上的心跳了吗?你在哪个盒子上测试?
我是一名优秀的程序员,十分优秀!