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 函式就是乙個冪等函式....