📄 gamepacket.pas
字号:
unit gamepacket;
interface
uses
Windows, Sysutils, Classes, dialogs,
Winsock2, dllform, gamecode;
procedure gamePacketsend (buf:pchar; len:integer);
procedure gamePacketrecv (buf:pchar; len:integer);
procedure sendmsg (source:pchar; size:integer );
function MyWSASendaa(SendBuf:PChar;SendLen:Integer):Integer;
function SaveLog(LogStr:String):integer;
var
sendnum :integer ;
recvnum :integer;
gamesocket :Tsocket=0; //定义socket
stratnum : bool = false ; //初始化封包序号标志
sendcount : array [0..1] of byte ; //游戏发送封包序号 2字节. 无符号型
newsendcount :pchar; //游戏发送封包序号 2字节. char型
implementation
procedure newsendnum; //更新封包序列号
begin
if byte(newsendcount[0]) <> $FF then
begin
sendcount[0] := byte(newsendcount[0]);
inc (sendcount[0]);
sendcount[1] := byte(newsendcount[1]);
newsendcount := @sendcount;
end else //如果第一位是FF 第二位加上 1
begin
sendcount[0] := $00;
sendcount[1] := byte(newsendcount[1]);
inc (sendcount[1]);
newsendcount := @sendcount;
end;
end;
procedure gamePacketsend (buf:pchar; len:integer);
var
outlen : integer ;
outchar,recvbuf : array [0..1000] of char ;
logstr : string;
begin
copychar ( buf, recvbuf, len );
outlen := Decode ( @recvbuf[1], len-1, outchar);
if stratnum = false then //初始化封包序列号 (只执行一次)
begin
sendcount[0] := byte(outchar[2]);
sendcount[1] := byte(outchar[3]);
newsendcount := @sendcount;
stratnum := true;
end;
if dllform1.Checksend.Checked =false then exit;
with dllform1.Listsend.Items.Add do //填加记录到表
begin
caption := inttostr(sendnum);
inc(sendnum);
subitems.add(chartoascii (@outchar[0],2)); //封包长度
subitems.add(chartoascii (@outchar[2],2)); //封包代号
subitems.add(chartoascii (@outchar[4],4)); //0000 0000
subitems.add(chartoascii (@outchar[8],2)); //标识符后数据长度
subitems.add(chartoascii (@outchar[10],1)); //标识符
subitems.add(chartoascii (@outchar[11],outlen-11)); //参数
subitems.add(pchar(@outchar[13])); //参数
end;
if dllform1.Checksave.Checked then //保存到文件
begin
logstr := 'send'+' '+inttostr(sendnum)+' '+chartoascii (@outchar[10],1)+' '+chartoascii (@outchar[11],outlen-11)+' '+pchar(@outchar[13]);
SaveLog (logstr);
end;
end;
procedure gamePacketrecv (buf:pchar; len:integer);
var
outlen : integer ;
outchar,recvbuf : array [0..1000] of char ;
logstr : string;
begin
copychar ( buf, recvbuf, len );
outlen := Decode ( @recvbuf[1], len-1, outchar);
if dllform1.Checkrecv.Checked = false then exit ;
with dllform1.Listrecv.Items.Add do
begin
caption := inttostr(recvnum);
inc(recvnum);
subitems.add(chartoascii (@outchar[0],2)); //封包长度
subitems.add(chartoascii (@outchar[2],2)); //封包代号
subitems.add(chartoascii (@outchar[4],4)); //0000 0000
subitems.add(chartoascii (@outchar[8],2)); //标识符后数据长度
subitems.add(chartoascii (@outchar[10],1)); //标识符
subitems.add(chartoascii (@outchar[11],outlen-11)); //参数
subitems.add(pchar(@outchar[17])); //参数
end;
if dllform1.Checksave.Checked then
begin
logstr := 'recv'+' '+inttostr(recvnum)+' '+chartoascii (@outchar[10],1)+ ' '+chartoascii (@outchar[11],outlen-11)+' '+pchar(@outchar[13]);
SaveLog (logstr);
end;
end;
procedure sendmsg (source:pchar; size:integer ); //加密并调用发送封包
var
len : integer;
outchar,sendbuf : array [0..1000] of char;
begin
Len:=Encode(source,size,@outchar[1]);
copychar (outchar,sendbuf,Len);
if GameSocket<>0 then
MyWSASendaa(sendbuf,len+2);
end;
function MyWSASendaa(Sendbuf:PChar;SendLen:Integer):Integer;
var
Buffers : WSABUF;
NumberOfSent:dword;
begin
Buffers.buf:=Sendbuf;
Buffers.len:=SendLen;
Buffers.buf[0]:='(';
Buffers.buf[SendLen-1]:=')';
MyWSASendaa:=WSASend(GameSocket,@Buffers,1,NumberOfSent,0,nil,nil);
end;
function SaveLog(LogStr:String):integer; //log记录
var
Log:textfile;
begin
assignfile(Log,dllform1.Edit1.text);
if fileexists(dllform1.Edit1.text)=false then rewrite(Log)
else
append(Log);
Writeln(Log,LogStr);
closefile(Log);
SaveLog := 1;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -