C 套接字的select選擇模型

2021-06-01 21:35:55 字數 1798 閱讀 3415

select選擇模型是套接字進行非同步io的基本模式,非常方便。

在c++中,select()函式的原型如下:

int select(

__in int nfds

, __in_out fd_set* readfds

, __in_out fd_set* writefds

, __in_out fd_set* exceptfds

, __in const struct timeval* timeout

);

即,使用fd_set結構體來存放讀、寫、異常狀況的套接字;

使用巨集fd_zeor來清空fd_set集、fd_set來增加套接字到某個fd_set集中、fd_clr來刪除某個fd_set集中的套接字、fd_isset來判斷套接字是否屬於某個fd_set集;

timeout引數使用infinite可一直等待,直到函式放回(有套接字滿足條件)

返回值是原fd_set集經過select()函式篩選之後的滿足條件(即有讀、寫或異常狀態)套接字的數量,然後依次進行i/o操作;

在c#中,select方法內化為socket類的靜態方法之一,fd_set也用更為方便的arraylist類來代替(該類實現了ilist介面)

select方法的原型如下:

public

static

void

select(

ilist checkread,

ilist checkwrite,

ilist checkerror,

int microseconds

)

當microseconds=-1時,表示一直等待,直到套接字滿足條件後返回

可以看到,該函式沒有返回值。因為滿足需要的套接字都留在了arraylist類的物件中,用arraylist物件的count屬性判斷個數,以陣列下標形式逐個訪問套接字以進行i/o操作即可。

下面是msdn中給出的乙個示例(有改動):

//獲取主機ip

iphostentry iphostentry = dns.resolve(dns.gethostname());

ipaddress ipaddress = iphostentry.addresslist[0];

socket socket0 = null;

socket socket1 = null;

socket socket2 = null;

socket remotesock = null;

//存放監聽套接字

arraylist listenlist = new arraylist();

listenlist.add(socket0);

listenlist.add(socket1);

listenlist.add(socket2);

//建立3個tcp監聽套接字

for( int i = 0; i < 3; i++ )

// only the sockets that contain a connection request

// will remain in listenlist after select returns.

socket.select(listenlist, null, null, 1000);

for( int i = 0; i < listenlist.count; i++ )

MFC基於select模型的套接字類之伺服器(5)

在定義了執行緒函式之後,回到ctcpsocket server類的startserver 函式中。接下來通過 createthread 函式建立 threadfunc startserver 的執行緒,接受來自客戶端的連線。1 createthread 函式 該函式的作用是建立新執行緒,其格式為 h...

套接字i o模型

當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i o的winsock呼叫 如send 和recv 一直到操作完成時才返回。比如呼叫recv 函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。1 阻塞 blocking 模型 對於以下函式呼叫 int ir...

套接字I O模型

在unix下可用的5種i o模型為 柱塞i o模型 非柱塞i o模型 i o復用 select和poll 訊號驅動式i o sigio 非同步i o 柱塞式i o模型 最流行的i o模型是柱塞式i o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖 程序呼叫recvfrom,其系統...