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

我正在 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/

10-12 18:34