#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...