socket程式設計(二) select 模型

2021-06-09 00:44:47 字數 2479 閱讀 4787

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程式設計中還是比...