5 1 2 設定套接字的非阻塞模式

2021-04-17 12:52:29 字數 2737 閱讀 4492

當使用

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 方法,設定非阻...