當使用
socket()
函式和wsasocket()
函式建立套接字時,預設都是阻塞的。在建立套接字之後,通過呼叫
ioctlsocket()
函式,將該套接字設定為非阻塞模式。函式的第乙個引數是套接字,第二個引數設定為
fionbio
,第三個引數設定為
unsigned long
型別的非零值。下面**清單演示了如何用
ioctlsocket()
函式,設定套接字為非阻塞模式。
sockets;//
套接字unsigned long ul = 1;//
設定套接字選項
intnret;//
返回值s = socket(af_inet, sock_stream, 0);//
建立套接字
nret = ioctlsocket(s, fionbio, (unsigned long*)&ul);//
設定套接字非阻塞模式
if (nret == socket_error)
套接字設定為非阻塞模式後,在呼叫
windows sockets api
函式時,呼叫函式會立即返回。大多數情況下,這些函式呼叫都會呼叫「失敗」,並返回
wsaewouldblock
錯誤**。說明請求的操作在呼叫期間內沒有時間完成。通常,應用程式需要重複呼叫該函式,直到獲得成功返回**。下面程式清單示例了乙個在非阻塞套接字上反覆呼叫
recv()
函式,直到收到
1024
個位元組的資料。
#definenum_required1024//
需要讀入資料的大小
#definemax_size2048//
輸入緩衝區的大小
tcharbuff[max_size];//
輸入緩衝區
boolclose;//
對方關閉了連線
socketsock;//windows sockets
void readdata(void)
else if(wsaetimedout == err || wsaenetdown == err)//
連線已經斷開}
if( 0 == nread)//
客戶端關閉了連線
ntotal += nread;
nleft -= nread;
nbytes += nread;
}return;
}在該程式中,通過呼叫
wsagetlasterror()
函式獲得
recv()
函式返回的錯誤**。當返回
wsaewouldblock
錯誤時,說明此時套接字的緩衝區還沒有準備好的資料。需要繼續呼叫該函式。
在該程式中,還對
recv()
函式返回的其他錯誤**進行處理。
wsaetimedout
和wsaenetdown
錯誤說明,此時由於網路系統的原因與對方的連線已經斷開了。當函式返回
0時,說明對方關閉了連線。在程式中通過設定
close
布林變數值為
true
,表明與對方的連線已經斷開。呼叫
break
語句跳出
while
迴圈體,函式退出。在開發中,應該根據具體情況對函式返回的錯誤值進行具體處理。
不同的windows sockets api
函式,在呼叫失敗時返回的
wsaewouldblock
錯誤**具有不同的含義。表
對幾個windows sockets api
函式返回
wsaewouldblock
錯誤的含義進行了總結。
表wsaewouldblock
的含義
函式名 說明
accept()
和wsaacept()
應用程式沒有收到連線請求
recv()
、wsarecv()
、recvfrom()
和wsarecvfrom()
接收緩衝區沒有收到資料
send()
、wsasend()
、sendfrom()
和wsasendfrom()
傳送緩衝區此時不可用
connect()
和wsaconnect()
連線未能立即完成
closescoket()
通常情況下意味著應用程式使用
so_linger
選項並且設定了乙個非零的超時值,呼叫了
setsocketopt()函式
需要說明的是並非所有的
windows sockets api
在非阻塞模式下呼叫,都會返回
wsaewouldblock
錯誤。例如,以非阻塞模式的套接字為引數呼叫
bind()
函式時,就不會返回該錯誤**。當然,在呼叫
wsastartup()
函式時更不會返回該錯誤**,因為該函式是應用程式第一呼叫的函式,當然不會返回這樣的錯誤**。
要將套接字設定為非阻塞模式,除了使用
ioctlsocket()
函式之外,還可以使用
wsaasyncselect()
和wsaeventselect()
函式。當呼叫該函式時,套接字會自動地設定為非阻塞方式。在後續章節中,講解該函式的使用方法。
套接字的非阻塞模式
1 非阻塞套接字的模式 1 伺服器端 通常socket執行後預設為阻塞模式。要呼叫ioctlsocket函式設定非阻塞模式。如 wsadata data wsastartup makeword 2,2 data sersocket socket af inet,sock stream,ipproto...
套接字的阻塞模式和非阻塞模式
阻塞模式 windows套接字在阻塞和非阻塞兩種模式下執行i o操作。在阻塞模式下,在i o操作完成前,執行的操作函式一直等候而不會立即返回,該函式所在的執行緒會阻塞在這裡。相反,在非阻塞模式下,套接字函式會立即返回,而不管i o是否完成,該函式所在的執行緒會繼續執行。在阻塞模式的套接字上,呼叫任何...
非阻塞套接字
建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...