套接字的非阻塞模式

2022-03-26 16:10:50 字數 1966 閱讀 7733

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 等待某種操作的完成。當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待...