我們在利用IOCP(完成端口)進(jìn)行程序設(shè)計(jì)的時(shí)候,經(jīng)常要關(guān)閉一些不滿足條件的套接字。假如我們直接采用closesocket方法進(jìn)行關(guān)閉的話,綁定到IO端口的此套接字的未發(fā)送的數(shù)據(jù)就會(huì)丟失,這種情況是我們不愿意發(fā)生的。下面介紹一種合理關(guān)閉此套接字的方法:
首先,利用setsockopt(MSDN)函數(shù)設(shè)定套接字的選項(xiàng),我們把此套接字設(shè)定為:假如有數(shù)據(jù)未發(fā)送,當(dāng)數(shù)據(jù)發(fā)送完后再關(guān)閉此套接字。
代碼如下:
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(Socket, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct) );
//
// Now close the socket handle. This will do an abortive or graceful close, as requested.
CancelIo((HANDLE) Socket);
closesocket(Socket);
clientSocket = INVALID_SOCKET;
當(dāng)在完成端口的數(shù)據(jù)被發(fā)送出去之后,套接字就會(huì)被關(guān)閉,這樣我們就完成了一個(gè)套接字的關(guān)閉。