SCTP套接字上的close调用是阻塞还是非阻塞?

时间:2015-12-21 12:20:31

标签: sockets sctp

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

我在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内核级别完成正常关闭吗?

1 个答案:

答案 0 :(得分:2)

默认情况下是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
  原始。此选项会影响与所有相关的所有关联   插座。

     

逗留选项结构

     

struct linger {        int l_onoff; / *选项开/关 /        int l_linger; / 逗留时间* /};

     

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

     

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

如果您正在使用Linux,那么源代码中也会these notes