winsock之select選擇模型

2021-10-05 16:21:47 字數 1679 閱讀 3968

由於使用傳統的socket模型在處理大量的客戶端時需要不斷的開闢多餘的執行緒,這樣無非會很大程度上浪費系統資源,因此,我們需要一種能夠管理套接字的模型。最簡單的select選擇模型可以採用一種有序的方式,輪詢fd_set集合,從而同時進行對多個套接字的管理。

所用結構體:

typedef struct fd_set fd_set;

1.主要用到的幾個函式

intselect(

intnfds,

fd_set*readfds,

fd_set*writefds,

fd_set*exceptfds,

const struct timeval*timeout

);nfds:本引數忽略,僅起到相容作用。

readfds:(可選)指標,指向一組等待可讀性檢查的套介面。

writefds:(可選)指標,指向一組等待可寫性檢查的套介面。

exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。

timeout:select()最多等待時間,對阻塞操作則為null。

fd_clr(s,*set):從集合set中刪除描述字s。

fd_isset(s,*set):若s為集合中一員,非零;否則為零。

fd_set(s,*set):向集合新增描述字s。

fd_zero(*set):將set初始化為空集null。

2.實現原理

只需建立兩個執行緒,乙個主要負責監聽客戶端的連線,並把套接字加入到fd_set集合中,另乙個執行緒主要負責輪詢管理fd_set集合中的套接字進行通訊。

伺服器**:

#define _winsock_deprecated_no_warnings

#include #include #include #pragma comment(lib,"ws2_32")

socket serversock;

int clientnum = 0;

fd_set socket_fd1, fd_read;

int maxfd;

void t_accept()

; int nsize = sizeof caddr;

fd_zero(&socket_fd1);

while (1)

}

void sendmsg()//輪詢進行通訊

}}

void main()

}} }

closesocket(serversock);

closesocket(clientsock);

wsacleanup();

system("pause");

}

winsock中select模型實戰

選擇 select 模型是winsock中最常見的 i o模型。核心便是利用 select 函式,實現對 i o的管理!利用 select 函式來判斷某socket上是否有資料可讀,或者能否向乙個套接字寫入資料,防止程式在socket處於阻塞模式中時,在一次 i o 呼叫 如send或recv ac...

WinSock學習 1 Select模型

新學的,有錯誤請指出 bool initialsocket socket sock,u short port int findposofset socket s,fd set set int tmain int argc,tchar argv fd set fdset fd zero fdset f...

select 全選和反選 jquery

checkbox id in shareuser 10 name shareuser value 10 10 checkbox id in shareuser 11 name shareuser value 11 11 checkbox id in shareuser 12 name shareus...