I O 完成埠實現

2021-10-12 00:09:50 字數 2591 閱讀 2177

這篇文章是繼承上篇《windows 同步裝置 i/o 與非同步裝置 i/o》,未讀過的讀者可以去看看再來看這篇文章哈。

建立新的i/o完成埠

i/o完成可能是最複雜的windows核心物件了,為了建立乙個i/o完成端**們需要呼叫createiocompletionport函式:

handle winapi createiocompletionport(

_in_ handle filehandle,

_in_opt_ handle existingcompletionport,

_in_ ulong_ptr completionkey,

_in_ dword numberofconcurrentthreads

);

這個函式執行兩項不同的任務:它不僅會建立乙個i/o完成埠,而且會將乙個裝置與乙個i/o完成埠關聯起來。為了只建立乙個i/o完成端**們可以對上面的函式進行封裝:

handle createnewcompletionport(dword threadsize)

這個函式只有乙個引數threadsize,它呼叫了createiocompletionport來建立乙個新i/o完成埠。為了只建立乙個i/o完成埠前三個引數傳入固定值invalid_handle_value, null和0,第四個引數告訴i/o完成端在統一時間最多有多少執行緒處於可執行的狀態。如果threadsize傳入0,那麼i/o埠會使用預設值也就是cpu數量。這個通常也是我們想要的。

將裝置和i/o完成埠關聯

當我們建立乙個i/o完成埠的時候,系統核心實際上會建立5個不同的資料結構。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-f**3urmz-1607852667079)(

我們封裝乙個函式將i/o完成埠和裝置關聯:

bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword  dwcompletionkey)

hcompletionport 為createnewcompletionport建立完成埠的控制代碼、hdevice為裝置控制代碼、dwcompletionkey 為完成鍵當i/o完成時會返回我們設定的dwcompletionkey的值。這個值作業系統並不關心但是我們自己需要關心。

如何使執行緒等待i/o完成通知

執行緒通過呼叫getqueuedcompletionstatus可以將自己切換到睡眠狀態,來等待裝置i/o請求完成並進入完成埠。

bool getqueuedcompletionstatus(

handle completionport,

lpdword lpnumberofbytestransferred,

pulong_ptr lpcompletionkey,

dword dwmilliseconds

);

直接上**

//新建工程iocomplet工程, 拷貝**到main.cpp

#include #include #include #define vioserial_port_path l"e:\\code\\iocomplet\\debug\\iocomplet1.pdb"

#define max_size 20

char buf[max_size];

handle hport;

handle h;

handle createnewcompletionport(dword threadsize)

bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword dwcompletionkey)

enum iotype

m_iotype;

};void func()}}

} printf("end\n");

} printf("end end\n");

}int main()

else

std::thread proc(func);

proc.detach();

sleep(1000);

myio myio;

myio.hevent = null;

myio.internal = 0;

myio.internalhigh = 0;

myio.offset = 0;

myio.offsethigh = 0;

myio.m_iotype = myio::iotype::io_read;

dword readsize;

bool retr = readfile(h, buf, max_size, &readsize, &myio);

if (retr == false)

}} sleepex(infinite, false);

return 0;

}

完成埠實現echo tcp server

include stdio.h include winsock2.h pragma comment lib,ws2 32.lib define port 5150 define data bufsize 8192 typedef struct char buffer data bufsize int...

設定 i o port I O 完成埠實現

這篇文章是繼承上篇 windows 同步裝置 i o 與非同步裝置 i o 未讀過的讀者可以去看看再來看這篇文章哈。建立新的i o完成埠 i o完成可能是最複雜的windows核心物件了,為了建立乙個i o完成端 們需要呼叫createiocompletionport函式 handle winapi...

用IO完成埠實現管道非同步服務端

windows程式設計中,如果涉及到本地兩個程序之間的通訊,最好的方式就是管道,管道支援同步和非同步兩種模式,作為服務端,當然用非同步好,本文章直接提供用io完成埠實現管道服務端的 include stdafx.h include lptstr lpszpipename text pipe pipe...