完成埠模型

2021-05-13 02:14:20 字數 1621 閱讀 4094

最近要做乙個網路方面的小東東,基於c/s模式的。都說iocp可以使系統達到最佳的效能,因此我就比劃了兩下,獻醜了。抄書開始。

從本質上說,完成埠模型要求建立乙個windows完成埠物件,該物件通過指定數量的執行緒,對重疊i/o請求進行管理,以便為已經完成的重疊i/o請求提供服務。

首先要建立乙個i/o完成埠物件,用它面向任意數量的套接字控制代碼,管理多個i/o請求。呼叫以下函式建立完成埠物件:

handle createiocompletionport(

handle filehandle,// 同iocp關聯在一起的套接字控制代碼

handle existingcompletionport,// iocp控制代碼

ulong_ptr completionkey,        // 完成健

dword numberofconcurrentthreads // 在iocp上,同時允許執行的執行緒數量

);該函式有兩個作用:

(1)建立乙個完成埠物件

(2)將乙個控制代碼同完成埠關聯到一起

然後就要建立一定數量的工作者執行緒,以便在套接字的i/o請求投遞給完成埠後,為完成埠提供服務。寫文字描述很煩,還是看**吧:

#include "stdafx.h"

#include "netserver3.h"

#include

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

#include

using namespace std;

#ifdef _debug

#define new debug_new

#undef this_file

static char this_file = __file__;

#endif

// 單句柄資料

typedef struct tagper_handle_data

per_handle_data, *lpper_handle_data;

dword winapi serverworkerthread(lpvoid lpparam);

using namespace std;

int _tmain(int argc, tchar* argv, tchar* envp)

internetaddr.sin_family = pf_inet;

internetaddr.sin_port = htons(5000);

internetaddr.sin_addr.s_addr = htonl(inaddr_any);

bind(listen, (sockaddr*)&internetaddr, sizeof(internetaddr));

listen(listen, 5);

bool b = true;

while (b)

// 先檢查一下,看看是否在套接字上已有錯誤發生

if (0 == bytestransferred)

// 資料處理

// 成功了!!!這兒就收到了來自客戶端的資料

cout << periodata->databuf.buf << endl;

flags = 0;

return 0;

}

完成埠IO模型

iocp io完成埠 是一種伸縮性的io模型,廣泛應用於各種型別的高效能伺服器,如apache等。io完成埠,應用程式使用執行緒池處理非同步io請求的一種機制。最初設計 應用程式發出一些非同步io請求,裝置驅動把這些工作專案排序到完成埠,在完成埠上等待執行緒池便可以處理這些完成io。完成埠實際上是乙...

完成埠模型服務端

windows 完成埠模型服務端 include include pragma comment lib,ws2 32.lib using namespace std const int serverport 4399 const int msgsize 1024 typedef enum opera...

ACE 實現 完成埠 win32 I O模型

在win32平台上最有效率的io模型,莫過於完成埠了。csdn上到處都是關於完成埠的問題。在ace中對win32平台的完成埠有著非常好的封裝。ace中前攝式框架的win32實現就是使用的完成埠。我們先來看看這個框架有哪些組成部分。ace proactor 前攝器,真怪異的名字。叫非同步事件分配者多好...