我們在利用IOCP(完成端口)進行程序設計的時候,經常要關閉一些不滿足條件的套接字。假如我們直接采用closesocket方法進行關閉的話,綁定到IO端口的此套接字的未發送的數據就會丟失,這種情況是我們不愿意發生的。下面介紹一種合理關閉此套接字的方法:
首先,利用setsockopt(MSDN)函數設定套接字的選項,我們把此套接字設定為:假如有數據未發送,當數據發送完后再關閉此套接字。
代碼如下:
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;
當在完成端口的數據被發送出去之后,套接字就會被關閉,這樣我們就完成了一個套接字的關閉。