windows socket----select模型
一般我們的網(wǎng)絡(luò)編程都是用bind ,listen,accept,send/sendto,recv/recvfrom。在創(chuàng)建套接字的時(shí)候,是默認(rèn)使用阻塞模式的,每當(dāng)我們調(diào)用send/sendto等方法時(shí),套接字都會(huì)進(jìn)入阻塞狀態(tài),等到條件滿(mǎn)足后才返回。當(dāng)然為每個(gè)連接創(chuàng)建線(xiàn)程是個(gè)解決這個(gè)問(wèn)題的好辦法。如:比較容易想到的一種服務(wù)器模型就是采用一個(gè)主線(xiàn)程,負(fù)責(zé)監(jiān)聽(tīng)客戶(hù)端的連接請(qǐng)求,當(dāng)接收到某個(gè)客戶(hù)端的連接請(qǐng)求后,創(chuàng)建一個(gè)專(zhuān)門(mén)用于和該客戶(hù)端通信的套接字和一個(gè)輔助線(xiàn)程。以后該客戶(hù)端和服務(wù)器的交互都在這個(gè)輔助線(xiàn)程內(nèi)完成。這種方法比較直觀,程序非常簡(jiǎn)單而且可移植性好,但是不能利用平臺(tái)相關(guān)的特性。例如,如果連接數(shù)增多的時(shí)候(成千上萬(wàn)的連接),那么線(xiàn)程數(shù)成倍增長(zhǎng),操作系統(tǒng)忙于頻繁的線(xiàn)程間切換,而且大部分線(xiàn)程在其生命周期內(nèi)都是處于非活動(dòng)狀態(tài)的,這大大浪費(fèi)了系統(tǒng)的資源。
我們也可以通過(guò)ioctlsocket方法使用非阻塞模式套接字,但是這對(duì)程序員的代碼量是個(gè)考驗(yàn)。
?
Select(選擇)模型是Winsock中最常見(jiàn)的I/O模型。也是解決這二者問(wèn)題的方案,和前兩者比較有很大的進(jìn)步。并且不會(huì)改變套接字的工作模式。
int select (int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout );?該函數(shù)返回處于就緒態(tài)并且已經(jīng)被包含在fd_set結(jié)構(gòu)中的套接字總數(shù)。如果超時(shí)則返回0。
????第一個(gè)參數(shù)nfds被忽略。
????第二個(gè)參數(shù)readfds,可讀性套接字集合指針。
????第三個(gè)參數(shù)writefds,可寫(xiě)性套接字集合指針。
????第四個(gè)參數(shù)exceptfds,檢查錯(cuò)誤套接字集合指針。
????第五個(gè)參數(shù)timeout,等待時(shí)間。
readfds,writefds,exceptfds三個(gè)參數(shù)至少有一個(gè)不為NULL。
typedef struct fd_set {u_int fd_count; /* how many are SET? */SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ } fd_set;?
fd_set是一個(gè)SOCKET隊(duì)列,以下宏可以對(duì)該隊(duì)列進(jìn)行操作:
FD_CLR( s, *set) 從隊(duì)列set刪除句柄s;
FD_ISSET( s, *set) 檢查句柄s是否存在與隊(duì)列set中;
FD_SET( s, *set )把句柄s添加到隊(duì)列set中;
FD_ZERO( *set ) 把set隊(duì)列初始化成空隊(duì)列.
Select模型工作流程:當(dāng)把我們要監(jiān)控的那些套接字根據(jù)各自的操作放入到readfds,writefds,exceptfds中,當(dāng)select方法返回后,我們通過(guò)判斷是否套接字還在那個(gè)readfds中,如果在,說(shuō)明有數(shù)據(jù)可以讀,調(diào)用recv方法讀數(shù)據(jù)。其他集合一樣。以監(jiān)聽(tīng)套接字為例:Select()--------->FD_ISSET(listenSocket,&readSet)------->acceptSocket=accept(listenSocket,(sockaddr*)&addr,&len); ?此時(shí)在調(diào)用accept就不會(huì)阻塞了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3310449.html
總結(jié)
以上是生活随笔為你收集整理的windows socket----select模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jTessBoxEditor for T
- 下一篇: 清北等多所双一流官宣,今年是最容易上名校