gpt4 book ai didi

c - 如何修复 sctp_sendmsg 挂起至无法访问的主机

转载 作者:行者123 更新时间:2023-11-30 14:39:17 27 4
gpt4 key购买 nike

我在我的 C 应用程序中通过 lksctp-tools(CentOS 7.3、lksctp-tools-1.0.17-2.el7.x86_64)使用 Linux SCTP。当使用 sctp_sendmsg() 函数与无法访问的目标主机建立新的 SCTP 关联时,如何避免该函数挂起。

当从 C 代码触发 sctp_sendmsg() 与无法访问的目标主机建立新的 SCTP 关联时,它会挂起几分钟,并且在wireshark中,我看到 Linux 发送 SCTP INIT 重试。如何避免这种挂起?是否可以配置一些超时(例如:1秒)来中断 sctp_sendmsg() 或者是否可以以某种方式快速检查目的地是否处于事件状态(我不想遵循 ICMP req-resp方式)

配置的 TTL 和标志参数无助于解决此问题。

const uint32_t ttl = 1000; //ms
rc = sctp_sendmsg(sctp_socket->fd, data.s, data.len, (struct sockaddr*)&sin, sizeof(sin), htonl(ppid), 0, 0, ttl, 0);
if (rc < 0) {
printf("Could not connect: %s\n", strerror(errno));
return 0;
}

最佳答案

我认为设置 SCTP_INIT 参数会有帮助

     struct sctp_initmsg {
uint16_t sinit_num_ostreams;
uint16_t sinit_max_instreams;
uint16_t sinit_max_attempts;
uint16_t sinit_max_init_timeo;
};

sinit_max_attempts: This integer specifies how many attempts the
SCTP endpoint should make at resending the INIT. This value
overrides the system SCTP 'Max.Init.Retransmits' value. The
default value of 0 indicates the use of the endpoint's default
value. This is normally set to the system's default
'Max.Init.Retransmit' value.

sinit_max_init_timeo: This value represents the largest timeout or
retransmission timeout (RTO) value (in milliseconds) to use in
attempting an INIT. Normally, the 'RTO.Max' is used to limit the
doubling of the RTO upon timeout. For the INIT message, this
value may override 'RTO.Max'. This value must not influence
'RTO.Max' during data transmission and is only used to bound the
initial setup time. A default value of 0 indicates the use of the
endpoint's default value. This is normally set to the system's
'RTO.Max' value (60 seconds).

在建立连接(或调用 sctp_sendmsg)之前设置套接字选项,如下所示:

    sctp_initmsg init;
init.sinit_max_attempts = m_nMaxAttempts;
init.sinit_max_init_timeo = m_nMaxInitTimeout;

if (setsockopt(nSockID, SOL_SCTP, SCTP_INITMSG, &init, sizeof(init)) != 0)
{
std::cout << strerror(errno);
return -1;
}
return 0;

关于c - 如何修复 sctp_sendmsg 挂起至无法访问的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56143624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com