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