2015-12-21 142 views
3

我正面臨一個問題,我不確定我是否可以稱之爲問題或其理解差距。SCTP套接字上的關閉調用是阻塞還是非阻塞?

我在SCTP插座FD(像這樣調用close():關閉(sctp_sock_fd);)我期待這千鈞一髮將返回當SCTP SHUTDOWN流將完成即會在下面做然後返回:

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

但我所看到的,它看起來像close(sctp_sock_fd);通話結束後返回不久,SCTP關機順序正在進行中。

如果這是真的,它的非阻塞的調用那麼有沒有什麼辦法可以保證在SCTP內核級已完成??

回答

2

是的,默認情況下,close()在SCTP套接字上是非阻塞的,它只會啓動關閉過程,而不是等待它完成。蒙山此設置

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

您可以通過設置SO_LINGER套接字選項更改此

8.1.4。 SO_LINGER

應用程序可以使用此選項來執行SCTP ABORT
原語。此選項會影響所有與
套接字相關的關聯。

的繞樑選項結構是

結構留連{ INT l_onoff;/*選項開/關/ int l_linger;/逗留時間* /};

要啓用該選項,請將l_onoff設置爲1.如果將l_linger值爲 設置爲0,則調用close()與ABORT原語相同。如果 的值設置爲負值,則setsockopt()調用將返回一個錯誤 。如果該值設置爲正值 linger_time,則close()最多可以被鎖定linger_time。 請注意,根據POSIX ,時間單位爲秒,但在特定平臺上可能會有所不同。如果優雅 關機階段在此期間未完成,close()將返回 ,但正常關機階段將繼續在 系統中。

請注意,這是一個套接字級別的選項,而不是SCTP級別的選項。 使用此選項時,應用程序必須在調用中指定級別爲
SOL_SOCKET。

如果您使用的是Linux,那麼在源代碼中也有these notes

+0

非常感謝您的解釋。 :) – Pushpendra