IOCP 服務端案例

2021-07-26 18:49:46 字數 2943 閱讀 6392

epoll 和 iocp效能比較

每種作業系統(核心級)都會提供特有的i/o模型以提高效能。其中linux的epoll、bsd的kqueue、windows的iocp。它們都是在作業系統級別上提供支援並且完成相關功能。那麼問題來了:到底是epoll優於iocp 還是後者優於前者呢? 個人認為至少對於目前的我來說,這兩種模型都是非常優秀的(因為我也不知道誰更優秀)。個人認為不管是eopll還是iocp都具有各自獨特的優點,但是這並非左右了伺服器效能的因素。至少他們的工作機制不同,所以對於epoll或者iocp,各位自行判斷。

知識補給
iocp不僅是負責i/o工作,也還有至少建立1個執行緒並使其負責全部i/o的前後處理。理解iocp的時候不要把目光著重集中到執行緒上,而是要注意一下兩點:

1、i/o是否是以非阻塞模式工作?

2、怎樣確定非阻塞模式的i/o是否完成了工作?

首先介紹相關函式

#include

handle createiocompletionport(handle filehandle,handle existingcompletionport,ulong_ptr completionkey,dword numberofconcurrentthreads);

filehandle:建立cp物件時傳遞 invalid_handle_value。

existingcompletionport:建立cp物件時傳遞null。

completionkey:建立cp物件時傳遞0。

numberofconcurrentthreads:分配給cp物件的用於處理i/o的執行緒數。如該引數為2時,則分配給cp物件的可以同時執行的執行緒數最多為2個。如果為0,則系統中的cpu個數就是可同時執行的最大執行緒數。

ps:該函式可以用於建立也可以用於連線。連線引數說明在下面

filehandle:要連線到的cp物件套接字控制代碼

existingcompletionport:要連線套接字的cp物件控制代碼

numberofconcurrentthreads:無論傳遞何值,只要該函式的第二個引數非null就會自動忽略。

確認完成埠完成的i/o和執行緒的i/o處理;

#include
completionport:註冊有已經完成i/o資訊的cp物件控制代碼

dwmilliseconds:超時資訊,超過該指定時間後返回false並跳出函式。傳遞infinite時,程式將阻塞,知道已經有完成i/o資訊寫入cp物件。

*下面上主題菜,注意兩個結構體的定義,並且留意結構體是何時被分配空間、何時被傳遞、如何被使用的。

#include 

#include

#include

#include

#include ;

#define buf_size 100

#define read 3

#define write 5

/*注意這兩個結構體是何時分配空間,如何被傳遞,如何被使用*/

typedef

struct per_handle_data, *lpper_handle_data;

typedef

wsabuf wsabuf_;

char buffer[buf_size];

int rwmode; // read or write;

}per_io_data, *lpper_io_data;

// 本應該為 dword 的型別,應該是api更新了,使用 unsigned

unsigned winapi echothreadmain (lpvoid lpcomport);

void error_handing (char *message);

int main ()

memset (&servadr, 0, sizeof (servadr));

servadr.sin_family = af_inet;

servadr.sin_addr.s_addr = inet_addr ("192.168.1.101");

servadr.sin_port = htons (9130);

bind (nservsock, (sockaddr*) &servadr, sizeof (servadr));

listen (nservsock, 5);

while ( 1 )

return0;}

// 由執行緒執行的函式

unsigned winapi echothreadmain (lpvoid lpcomport)

/*將伺服器收到的訊息傳送給客戶端*/

ioinfo->wsabuf_.len = bytetrans;

ioinfo->rwmode = write;

/*再次傳送訊息後接受客戶端訊息*/

ioinfo = (lpper_io_data) malloc (sizeof (per_io_data));

ioinfo->wsabuf_.len = buf_size;

ioinfo->wsabuf_.buf = ioinfo->buffer;

ioinfo->rwmode = read;

} else

}return0;}

void error_handing (char *message)

Socket傳輸案例(上) 服務端

這篇部落格呢主要是兩個手機進行 socket 通訊案例的分析 話說老娘也算寫了幾篇部落格,為什麼訪問量就是少的可憐呢 什麼是 tcp ip 協議,什麼是 socket 網路由下往上分為 物理層 資料鏈路層 網路層 ip協議 傳輸層 tcp協議 會話層 表示層和應用層 http協議 tcp tp協議簡...

HTTP服務端JSON服務端

最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...

基於flask 與python服務端案例

第一點 flask的中文手冊,雖然flask已經不再年輕。簡介 flask 是乙個微型的 python 開發的 web 框架,基於werkzeug wsgi工具箱和jinja2 模板引擎。flask使用bsd授權。flask也被稱為 microframework 因為它使用簡單的核心,用extens...