最精簡的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...