【问题标题】:close call on a SCTP socket is blocking or non blocking?SCTP 套接字上的关闭调用是阻塞的还是非阻塞的?
【发布时间】:2016-03-27 12:29:49
【问题描述】:

我面临一个问题,不确定我是否可以将其称为问题或只是理解差距。

我在 SCTP 套接字 FD 上调用 close()(类似于:close(sctp_sock_fd);)。我希望当 SCTP SHUTDOWN 流程完成时,此关闭调用将返回,即它将在下面执行然后返回:

SHUTDWON (Source -> Peer)
SHUTDWON_ACK (Source <- Peer)
SHUTDOWN_COMPLETE (Source -> Peer)

但我看到close(sctp_sock_fd); 在调用后不久返回,并且 SCTP 关闭序列正在进行中。

如果它确实是一个非阻塞调用,那么我有什么办法可以确保在SCTP 内核级别的正常关闭已经完成??

【问题讨论】:

    标签: sockets sctp


    【解决方案1】:

    是的,默认情况下close() 在 SCTP 套接字上是非阻塞的,它只会启动关闭过程,而不是等待它完成。

    您可以通过设置 SO_LINGER 套接字选项来更改此设置:

    struct linger lin;
    unsigned int len =sizeof(lin);
    lin.l_onoff=1;
    lin.l_linger=10;
    setsockopt(socketfd,SOL_SOCKET, SO_LINGER,&lin, len);
    

    使用此设置,close() 将阻止长达 10 秒来自SCTP Socket API RFC

    8.1.4。 SO_LINGER

    应用程序可以使用此选项执行 SCTP ABORT
    原始。此选项影响与
    相关的所有关联 插座。

    逗留选项结构是

    结构逗留{ 诠释 l_onoff; /* 选项开/关 / 诠释 l_linger; / 逗留时间 */ };

    要启用该选项,请将 l_onoff 设置为 1。如果 l_linger 值为 设置为 0,调用 close() 与 ABORT 原语相同。如果 该值设置为负值,setsockopt() 调用将 返回错误。如果该值设置为正值 linger_time,close() 最多可以阻塞 linger_time。 请注意,根据 POSIX,时间单位以秒为单位, 但在特定平台上可能会有所不同。如果优雅 关闭阶段在此期间没有完成,close() 将 返回,但正常关闭阶段将在 系统。

    请注意,这是套接字级别的选项,而不是 SCTP 级别的选项。 使用此选项时,应用程序必须指定
    的级别 SOL_SOCKET 在调用中。

    如果您使用的是 Linux,源代码中还有 these notes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2010-12-30
      • 2014-10-19
      • 1970-01-01
      • 2010-12-04
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多