1、Windows Socket相關:
一般情況下,通過socket創建的套接字默認是阻塞的,因此如果非必需不要用以下代碼將套接字設置爲阻塞:
Uint32 argRet = 0;
if(SOCKET_ERROR == ioctlsocket(sockNew, FIONBIO, &argRet))
{
printf("ERROR: VdpuTransferManage_Listen::run() Set Socket nonblock failed!\n");
}
如果用上訴代碼設置之後,雖然關閉套接字是成功的,但系統並未釋放套接字資源(即端口仍然被佔用),使用netstat可以看到相應IP端口仍然處於TIME_WAIT狀態,系統會等待時間大約2ML(數據包最大生存週期),默認最大值爲2分鐘,纔會釋放套接字資源。
2、Windows Socket相關:
windows下TCP套接字,accept()返回的套接字與監聽套接字保持一致的阻塞性:
SOCKET sockNew = accept(m_ListenSocket, (struct sockaddr *)&clientService, (int *)&addrLen);
如上代碼,如果m_ListenSocket爲阻塞套接字,則sockNew也爲阻塞套接字;如果m_ListenSocket爲非阻塞套接字,則sockNew也爲非阻塞套接字。