TCP連接斷開的時候調(diào)用closesocket函數(shù),已經(jīng)討論過有優(yōu)雅的斷開和強(qiáng)制斷開,那么如何設(shè)置斷開連接的方式呢?是通過設(shè)置socket描述符一個linger結(jié)構(gòu)體屬性。
linger結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)如下:
struct linger
{
int l_onoff;
int l_linger;
};
有三種組合方式:
第一種
l_onoff
= 0;
l_linger忽略
這種方式下,就是在closesocket的時候立刻返回,底層會將未發(fā)送完的數(shù)據(jù)發(fā)送完成后再釋放資源,也就是優(yōu)雅的退出。
第二種
l_onoff非零
l_linger
= 0;
這種方式下,在調(diào)用closesocket的時候同樣會立刻返回,但不會發(fā)送未發(fā)送完成的數(shù)據(jù),而是通過一個REST包強(qiáng)制的關(guān)閉socket描述符,也就是強(qiáng)制的退出。
第三種
l_onoff非零
l_linger
> 0
這種方式下,在調(diào)用closesocket的時候不會立刻返回,內(nèi)核會延遲一段時間,這個時間就由l_linger得值來決定。如果超時時間到達(dá)之前,發(fā)送完未發(fā)送的數(shù)據(jù)(包括FIN包)并得到另一端的確認(rèn),closesocket會返回正確,socket描述符優(yōu)雅性退出。否則,closesocket會直接返回錯誤值,未發(fā)送數(shù)據(jù)丟失,socket描述符被強(qiáng)制性退出。需要注意的時,如果socket描述符被設(shè)置為非堵塞型,則closesocket會直接返回值。
|