C 伺服器重疊I O 事件通告模型

2021-07-13 21:08:22 字數 2356 閱讀 4978

#include#include#include #includeusing namespace std;

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

#pragma comment (lib, "mswsock.lib")

const int nport=10000;

const int buf_len=1024;

//對於同乙個客戶連線套接字,任意時刻只能有乙個為完成的非同步i/o操作,要麼是

//wsasend(iowrite),要麼是wsarecv(ioread)

typedef enum _io_operationio_operation;

//非同步i/o操作

struct connection

};typedef vectorconnectionlist;

// 重置conns,把其中無效的套接字移除

void resetconns(connectionlist& conns)

else

++it;

}}// 為wsawaitformultipleevents填充好需要等待的事件核心物件陣列

int filleventarray(handle hevents, handle hlistenevent,

connectionlist& conns)

return (int)(conns.size() + 1);

}// 非同步acceptex請求已完成,獲取結果

lpoverlaplisten, connectionlist& conns)

// 超出單執行緒所能處理的連線數

if(conns.size() + 1 >= wsa_maximum_wait_events)

// 為新接受的客戶連線建立乙個connection物件

conns.push_back(new connection(hacceptsocket));

connection* pconn = conns.back();

// 第一次的非同步i/o請求是ioread,因為對於回顯伺服器來說,必須先接收到資料後

// 才能回顯資料

pconn->op = ioread;

flags = 0;

// 對這個新的客戶連線發出第乙個非同步i/o請求

int nret = wsarecv(pconn->hsocket, &(pconn->wsabuffer), 1, null,

&flags, &pconn->overlap, null);

int lasterr = wsagetlasterror();

// 如果wsarecv失敗並且錯誤**不是error_io_pending

if(nret == socket_error && wsa_io_pending != lasterr)

return true;

}// 非同步的wsasend或者wsarecv已完成,獲取結果

bool handlesendrecv(connection* pconn)

}// 如果當前已完成的非同步i/o是wsasend

else if(pconn->op == iowrite)

// 計算緩衝區空閒空間的偏移

pconn->wsabuffer.buf = pconn->buffer + pconn->nbytes;

flags = 0;

pconn->op = ioread;

// 發出非同步wsarecv請求

int nret = wsarecv(pconn->hsocket, &(pconn->wsabuffer), 1, null,

&flags, &pconn->overlap, null);

int lasterr = wsagetlasterror();

if(nret == socket_error && wsa_io_pending != lasterr)

}return true;

} }}}

// 釋放資源

cleanup:

connectionlist::iterator it = conns.begin();

for(;it != conns.end();++it)

if(hlistensocket != invalid_socket)

closesocket(hlistensocket);

wsacloseevent(hlistenevent);

}int main(int argc, char* argv)

dowork();

wsacleanup();

return 0;

}

純重疊io伺服器模型

基礎 套接字重疊io 客戶端 telnet 或者自己隨意寫乙個 apc函式即需要使用alterable狀態的函式 例 sleepex.另外重疊io與非阻塞是2個概念.下面的 中使用到了非阻塞io,僅僅作用在了accept上.讓其不阻塞 原因是如果阻塞accpet 就沒法呼叫到sleepex上,那麼a...

基於重疊IO模型的 回顯TCP伺服器設計

1 套接字物件 為每個套接字建立乙個socket obj物件,記錄與之相關的資訊。typedef struct socket objsocket obj,psocket obj 所有重疊io提交到特定的套接字上,釋放對應套接字物件,必須保證此套接字再沒有重疊io,即noutstandingops 0...

伺服器IO模型之Select

阻塞與非阻塞 select模型目的 主要是避免在套接字呼叫上阻塞的應用程式有能力管理多個套接字,即是單一執行緒模式下只能處理乙個套接字的問題,這樣可以避免執行緒膨脹。select模型函式 int select in int nfds,inout fd set readfds,inout fd set...