我正面临一个问题,不确定我是否可以称之为问题或只是理解差距。
我正在 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
内核级别完成正常关闭? 最佳答案
是的,默认情况下 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 :如果您使用的是 Linux,源代码中还有 these notes。
关于sockets - 对 SCTP 套接字的关闭调用是阻塞还是非阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34395565/