select 模型是winsock中最常見的i/o模型,主要是它能夠防止程式在套接字處於阻塞模式的時候經過一次i/o操作後被阻塞,同時也能夠防止套接字處於非阻塞模式產生的wsaewouldblock錯誤
select模式也是最簡單的乙個i/o模式
int select( int nfds,
fd_set far* readfds,
fd_set far* writefds,
fd_set far* exceptfds,
const struct timeval far* timeout);
nfds:是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1,不能錯!在windows中這個引數 的 值無所謂,可以設定不正確。
readfds:(可選)
指標,指向一組等待可讀性檢查的
套介面。
writefds:(可選)指標,指向一組等待可寫性檢查的套介面。
exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。
timeout:select()最多等待時間,對阻塞操作則為null。
需要注意的是,上面三個可選引數不能都為空!
與select緊密相關的也有幾個函式
fd_zero(fd_set *fdset);將指定的檔案描述符集清空,在對檔案描述符集合進行設定前,必須對其進行初始化,如果不清空,由於在系統分
配記憶體空間後,通常並不作清空處理,所以結果是不可知的。
fd_set(fd_set *fdset);用於在檔案描述符集合中增加乙個新的檔案描述符。
fd_clr(fd_set *fdset);用於在檔案描述符集合中刪除乙個檔案描述符。
fd_isset(int fd,fd_set *fdset);用於測試指定的檔案描述符是否在該集合中。
一般select模型分為說那個步驟:
1. 將套接字新增到fd_set中。
2.呼叫select()函式。
3.若是select()呼叫成功,那麼就可以判斷這時候可以進行先相關的操作!
下面講解乙個例項!
乙個簡單的 聊天室程式的 客戶端例子。
封裝了幾個函式,
void check_online(lpvoid m); //連線伺服器
void revc_data(lpvoid m); //讀取資料函式
int cclientdlg::sock_select(int s) //檢查讀寫狀態
void cclientdlg::onbuttonsend() //傳送資訊!
在初始化函式裡裡面需要 建立執行緒!
下面是函式具體實現**
int cclientdlg::socket_ini() //套接字初始化
//初始化伺服器位址
serveraddr.sin_family = af_inet ;
serveraddr.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(8000);
serversocket = socket(af_inet , sock_stream , ipproto_tcp );
if ( connect( serversocket , (sockaddr *)&serveraddr,sizeof(serveraddr) ) == socket_error )
return 1;
}void check_online(lpvoid m) //連線伺服器
else
sleep(1000);
} sleep(1000);
}void revc_data(lpvoid m) //資料放的收
; int t = recv(pp->serversocket , buff , 255 , 0 );
if (t == 0 )
else
}sleep(100);
} }else
}int cclientdlg::sock_select(int s) //檢查讀寫狀態
else
if (fd_isset(serversocket , &fdset) && t > 0 )
return 0;
}void cclientdlg::onbuttonsend() //傳送資訊!
}
通過前一次的服務端連線 傳送功能可以實現,接受還沒有測試!
**下午貼上,上傳了,伺服器沒重新整理過來!
Socket程式設計之Select
select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...
socket程式設計之select
linux程式設計之select select作用是 在一段指定的時間內,監聽使用者感興趣的檔案描述符上可讀 可寫和異常等事件。1 socket阻塞模式 通常在socket程式設計中,我們習慣於寫connect accept recv recvfrom這樣的阻塞程式。如果事件不發生,程式就一直阻塞在...
socket程式設計 select方法使用
0.背景 最近要寫乙個rpc庫,即在客戶端向服務端傳送請求,伺服器計算並返回結果,要求實現服務端能同時接收多個客戶端請求但是不能使用執行緒庫,根據提示我知道了可以使用select函式來完成非阻塞方式工作的程式,於是我就開始了select方法的學習。1.概念 select在socket程式設計中還是比...