IOCP資料中介軟體

2021-09-07 22:39:49 字數 3816 閱讀 3482

iocp資料中介軟體

每包最大8k(8192位元組),超過8187位元組的資料要分包傳輸

首包有5個位元組的包頭:4位元組資料長度(告訴對方,此次總共將傳輸幾位元組資料) + 1位元組命令字(告訴對方,此次請求的何種命令)

unit ufun;

// 應用協議

// cxg 2016-9-23

inte***ce

uses

sysutils, classes, peachctrl.net.iocptcpserver, system.generics.collections

;const // 包長

pack_len = 8192;

const // 命令分類

cmd_qry_req = 1;

cmd_qry_res = 2;

cmd_post_req = 3;

cmd_post_res = 4;

cmd_up_file_req = 5;

cmd_up_file_res = 6;

cmd_down_file_req = 7;

cmd_down_file_res = 8;

cmd_data = 9;

type

thead = packed record // 包頭

cmd: byte;

len: integer;

packno: integer;

packqty: integer;

ver: byte;

end;

type

ttask = record // 一次任務

context: integer;

body: tbytes;

end;

pttask = ^ttask;

varg_tasklist: tlist; // 任務佇列

function validhead(ahead: thead): boolean;

function gettask(acontext: tcustomiocptcpserver.tperhandledata): pttask;

procedure processrecved(acontext: tcustomiocptcpserver.tperhandledata);

implementation

function validhead(ahead: thead): boolean;

begin

result := (ahead.cmd >= 1) and (ahead.len > sizeof(thead)) and (ahead.packno >= 1) and (ahead.packqty >= 1);

end;

function gettask(acontext: tcustomiocptcpserver.tperhandledata): pttask;

vari: integer;

begin

result := nil;

if (acontext = nil) or (g_tasklist.count = 0) then

exit;

system.tmonitor.enter(g_tasklist);

tryfor i := 0 to g_tasklist.count - 1 do

begin

if g_tasklist.items[i].context = integer(acontext) then

begin

result := g_tasklist.items[i];

exit;

end;

end;

finally

system.tmonitor.exit(g_tasklist);

end;

end;

procedure processrecved(acontext: tcustomiocptcpserver.tperhandledata);

varptask: pttask;

buf: tbytes;

head: thead;

bodylen: integer;

headlen: integer;

begin

headlen := sizeof(thead); // 包頭長

if acontext.ringbuffer.noprocessbuflen < headlen then

exit;

acontext.ringbuffer.peep(head, headlen); // 取包頭

if not ufun.validhead(head) then // 校驗包頭

exit;

if head.packqty = 1 then // 一批次只有乙個包

begin

if acontext.ringbuffer.noprocessbuflen < head.len then

exit;

new(ptask);

ptask.context := integer(acontext);

bodylen := head.len - headlen;

setlength(ptask.body, bodylen);

setlength(buf, head.len);

acontext.ringbuffer.pop(buf[0], head.len);

move(buf[headlen], ptask.body[0], bodylen);

g_tasklist.add(ptask); // 提交任務佇列

endelse if head.packqty > 1 then // 一批次有多個包

begin

if head.packno = 1 then // 首包

begin

if acontext.ringbuffer.noprocessbuflen < pack_len then

exit;

new(ptask);

ptask.context := integer(acontext);

setlength(ptask.body, head.len - head.packqty * headlen); // 一次分好快取

setlength(buf, pack_len);

acontext.ringbuffer.pop(buf[0], pack_len);

bodylen := pack_len - headlen;

move(buf[headlen], ptask.body[0], bodylen);

endelse

if head.packno > 1 then // 非首包

begin

if acontext.ringbuffer.noprocessbuflen < head.len then

exit;

ptask := gettask(acontext);

if ptask = nil then

exit;

setlength(buf, head.len);

acontext.ringbuffer.pop(buf[0], head.len);

bodylen := head.len - headlen;

move(buf[headlen], ptask.body[(head.packno - 1) * bodylen], bodylen);

if head.packno = head.packqty then // 包都收齊

g_tasklist.add(ptask); // 提交任務佇列

end;

end;

end;

end.

詠南IOCP中介軟體

詠南iocp中介軟體 特大好訊息,詠南中介軟體系列新增加 詠南iocp中介軟體。詠南iocp中介軟體完全相容詠南datasnap中介軟體的遠端方法介面。中介軟體delphi7 delphi xe10.1.1都能編譯。中介軟體使用unidac資料資料,可以驅動市面上幾乎所有的資料庫。客戶端開發支援de...

詠南IOCP中介軟體

詠南iocp中介軟體 特大好訊息,詠南中介軟體系列新增加 詠南iocp中介軟體。詠南iocp中介軟體完全相容詠南datasnap中介軟體的遠端方法介面。中介軟體delphi7 delphi xe10.1.1都能編譯。中介軟體使用unidac資料資料,可以驅動市面上幾乎所有的資料庫。客戶端開發支援de...

中介軟體 訊息中介軟體學習總結

冪等 在程式設計中.乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式 不會影響系統狀態,也不用擔心重複執行會對系統造成改變。例如,getusername 和settrue 函式就是乙個冪等函式....