最精簡的IOCP封裝

2021-09-07 22:36:39 字數 2222 閱讀 2346

最精簡的iocp封裝,delphi xe8直接編譯通過。winsock2.pas即使用delphi自帶的,相信xe7也能編譯,或者xe6,xe5也能。

單說winsock2.pas,我見過無數種版本的了,各版本winsock 2的api的方法的引數的資料型別居然都有出入,使用不同人封裝的winsock2.pas原始碼都要進行相應的調整,

否則無法編譯通過,我認為還是使用delphi官方的最為靠譜。

要用於實際應用的話,還要進行「粘包處理」。

我在delphi xe8下測試ok。

unit unit1;

inte***ce

uses

winsock2, windows, messages, sysutils, variants, classes, graphics, controls, forms,

dialogs, stdctrls, extctrls;

const

buf_size=1024;

//單句柄資料結構

lper_handle_data = ^tper_handle_data;

tper_handle_data = packed record

socket: tsocket;

end;

tlistenthread = class(tthread)

private

protected

procedure execute;override;

public

constructor create;

end;

tform1 = class(tform)

memo1: tmemo;

procedure formcreate(sender: tobject);

private

public

end;

varform1: tform1;

serversocket: tsocket;

implementation

//工作者執行緒

function workthread(completionportid: pointer):dword; stdcall;

varcompletionport: thandle;

bytestransferred: dword;

perhandledata: lper_handle_data;

periodata: lper_io_data;

flags: dword;

recvbytes: dword;

begin

completionport:= thandle(completionportid);

//顯示收到的資料,這樣做是不安全的,示例而已 :)

form1.memo1.lines.add(string(periodata.buf));

end;

//重置資料

periodata.recvbytes:= 0;

periodata.databuf.len:= buf_size;

periodata.databuf.buf:= @periodata.buf;

constructor tlistenthread.create;

begin

inherited create(false);

freeonterminate:= true;

end;

procedure tlistenthread.execute;

varwsdata: twsadata;

completionport: thandle;

si: tsysteminfo;

idx: integer;

threadid: dword;

localaddr:sockaddr_in;

clientaddr: sockaddr;

clientsocket: tsocket;

per_handle_data: lper_handle_data;

per_io_data: lper_io_data;

recvbytes: dword;

flags: dword;

begin

procedure tform1.formcreate(sender: tobject);

begin

//建立監聽執行緒

tlistenthread.create();

end;

end.

IOCP的封裝和使用

現在基於iocp input output completion port 的文章其實已經很多了,但是那些文章都不太容易理解,主要是因為iocp本身的一些不易理解的東西,並且沒有相關的能夠說明該技術和 示例的標準文件。因此我決定做乙個簡單的高併發iocp的例子 oiocpnet 並且提供詳細文件說明...

最精簡有效的 glibc locales 設定

最精簡有效的 glibc locales 設定 by erichsu begin.200412211044 經過昨天一天實驗,把 glibc 重灌了 4 次,得出如下獲得最精簡 glibc locales 設定的方法 下面是步驟,沒耐心了解其原因的朋友直接照做就可以,有興趣問個為什麼的,我會在步驟後...

最精簡的小寫金額轉大寫的函式

function changdx2 mmje double string const s1 string 零壹貳叄肆伍陸柒捌玖 s2 string 分角元拾佰仟萬拾佰仟億拾佰仟萬 function strtran const s,s1,s2 string string begin result st...