1. 程式人生 > >套接字設定為(非)阻塞模式

套接字設定為(非)阻塞模式

當socket 進行TCP 連線的時候(也就是呼叫connect 時),一旦網路不通,或者是ip 地址無效,就可能使整個執行緒阻塞。一般為30 秒(我測的是20 秒)。如果設定為非阻塞模式,能很好的解決這個問題,我們可以這樣來設定非阻塞模式:呼叫 ioctl 函式:
unsigned long flag=1;
if (ioctl(sock,FIONBIO,&flag)!=0)
{
closesocket(sock);
return false;
}
以下是對ioctlsocket 函式的相關解釋:

int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp);
s :一個標識套介面的描述字。
cmd :對套介面s 的操作命令。
argp :指向cmd 命令所帶引數的指標。

註釋:
本函式可用於任一狀態的任一套介面。它用於獲取與套介面相關的操作引數,而與具體協議或通訊子系統無關。支援下列命令:
FIONBIO :允許或禁止套介面s 的非阻塞模式。argp 指向一個無符號長整型。如允許非阻塞模式則非零,如禁止非阻塞模式則為零。當建立一個套介面 時,它就處於阻塞模式(也就是說非阻塞模式被禁止)。這與BSD 套介面是一致的。WSAAsynSelect() 函式將套介面自動設定為非阻塞模式。如果 已對一個套介面進行了WSAAsynSelect() 操作,則任何用ioctlsocket() 來把套介面重新設定成阻塞模式的試圖將以WSAEINVAL 失敗。為了把套介面重新設定成阻塞模式,應用程式必 須首先用WSAAsynSelect() 呼叫(IEvent 引數置為0 )來禁至WSAAsynSelect() 。