1
.非阻塞套接字的模式(1
)伺服器端
通常socket執行後預設為阻塞模式。要呼叫ioctlsocket函式設定非阻塞模式。
如:wsadata data;
wsastartup(makeword(2,
2),
&data);
sersocket
=socket(af_inet, sock_stream, ipproto_tcp);
if(invalid_socket
==sersocket)
cout
<<
"invalid socket!\n";
u_long imode =1
;ioctlsocket(sersocket, fionbio,
&imode);
在接受客戶端請求的執行緒中,若接受成功就返回客戶端的套接字,否則返回invalid_socket錯誤,
若錯誤**為wsaewouldblock,說明當前沒有客戶端請求。
如://
接受客戶端請求執行緒
dword winapi acceptclientpro(lpvoid lpp)
else
}else
}return0;
}就recv函式來說,在阻塞模式中,如果沒有客戶端傳送資料過來,執行緒到這裡會阻塞,直到有數
據傳送過來為止。在非阻塞模式中,沒有客戶端傳送資料過來,返回socker_error,錯誤**為wsaewouldblock。
如://
接收資料執行緒
dword winapi receivedatapro(lpvoid lpp)
else
if(wsaenetdown
==err
||//
客戶端關閉了連線
wsaetimedout
==err
||wsaeconnreset
==err ) }if
(0==receilen)
//客戶端關閉了連線
if(receilen
>=
sizeof
(datapack))
//成功接收}}
return0;
} (2
)客戶端
在客戶端的連線請求執行緒中,connect函式會返回socket_error,這並不是說明連線失敗,具體情況
要看它的wsagetlasterror()返回值,若它三次返回socket_error的error**依次為wsaewouldblock,
wsaeinval,wsaeisconn,就說明連線伺服器成功,否則失敗。但有的時候wsaeinval沒有出現就有wsaeisconn
了,所以我還是以wsaeisconn為連線完成的標誌,但要注意其實在三次返回**中,第一次的wsaewouldblock
之前的connect操作就成功了,如果沒出意外伺服器就要響應了。
如://
連線伺服器執行緒
dword winapi connetserverpro(lpvoid lpp)
else
if(wsaeinval
==n)
//監聽狀態
else
if(wsaeisconn
==n)
//連線完成
else}}
return0;
}在傳送資料執行緒中,send()返回的是傳送資料的長度說明傳送成功;返回socket_error時,若
錯誤**為wsaewouldblock就再重試,不是wsaewouldblock就說明有錯誤。】
如://
傳送資料執行緒
dword winapi senddatapro(lpvoid lpp)
else
//傳送成功
}return0;
}
套接字的阻塞模式和非阻塞模式
阻塞模式 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 方法,設定非阻...
非阻塞套接字
開始之前,需要先了解一下什麼會引起程序阻塞和喚醒的事件 1 向系統請求共享資源失敗。程序在向系統請求共享資源時,由於系統已無足夠的資源分配給它,此時程序因不能繼續執行而轉變為阻塞狀態。2 等待某種操作的完成。當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待...