我正面临一个问题,不确定我是否可以将其称为问题或只是理解差距。
我在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
内核级别完成正常关闭吗?
答案 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。