****我做了一套程序,可以让"彩虹天地"的单机软件狗像网络狗一样使用,可以省不少钱啊,转让源程序,,感兴趣的进来

shao528 2003-07-08 08:22:14
分两部分:

1.服务器部分:只要插上单机狗,运行服务器程序,其它的客户端就可以像网络狗一样通过提供的接口对单机狗做任何访问操作。

2.客户端部分:所有的操作都封装在一个类里面,使用很方便,提供源码(delphi),和程序集成就可以访问"网络狗"了。

"彩虹天地"的单机狗才50多块钱一个,而网络狗要200多,网络狗在加密强度上比单机狗强些,但这些只对一般的破解者也没多大用处,因此把单机狗当网络狗使用,可以省下一大笔钱!需要的和我联系,只收取很少费用。

e-mail:shaojian925@21cn.com
qq:229481711

附客户端的部分源码:

unit TxNetDogOp;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, WinSock, extctrls;

type
TDogCommand = (dcLog, dcReadStr, dcWriteStr, dcReadBinary, dcWriteBinary,
dcReadInteger, dcWriteInteger,dcReadWord, dcWriteWord,
dcReadFloat,dcWriteFloat, dcAutoCheck);

TDogDataRec = record //通信数据帧
FlagHeader : byte; //帧头,标识是不是合法的命令块开头 111

Command :TDogCommand; //命令
Result :longint; //结果
ErrMessage: string[100]; //错误信息

DogAddr :integer; //操作地址
ByteSize :integer; //字节数
DataStr :string[80]; //返回的字串值
DataInteger :integer;
DataWord :Word;
DataByte :Byte;
DataFloat :Real;
DataBinary : array[0..80] of Byte; //返回的二进制值

FlagEnd :byte; //标识是不是合法的命令块结尾 222
end;

TNetSoftDog = class(TObject)
private
FClientSocket : TClientSocket;
FTimer : TTimer;
FTimeOut : integer;
FHost :string;
FHostIp :string;

FCommData : TDogDataRec;
FOpFinished :boolean; //标志操作是否完成

procedure OnClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure OnClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
procedure OnClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure OnTimer(Sender:TObject);

procedure StartTimerOut(ASec :integer);

public
property CommData :TDogDataRec Read FCommData;

constructor Create(AHost, AHostIp :string; APort :integer);
destructor Destroy; override;

function TestHost(AHost :string) : boolean; //检测机器是否存在
function TestIp(IP:string): boolean;

function DoFunc :longint;
function LogIn() :longint;
function LogOut() :longint;
function ReadStr(nAddr, nLen :integer;var AStr :string) :longint;
function WriteStr(nAddr:integer;AStr :string) :longint;

function ReadWord(nAddr :integer; var AData :Word) :longint;
function WriteWord(nAddr :integer; AData :Word) :longint;

function ReadFloat(nAddr :integer; var AData :Real) :longint;
function WriteFloat(nAddr :integer; AData :Real) :longint;

function GetLinceCount(AModeNo:integer; var ALince:integer):longint;

function AutoCheckTxDog() :longint;
end;

...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shao528 2003-07-09
  • 打赏
  • 举报
回复
up
OO_is_just_P 2003-07-09
  • 打赏
  • 举报
回复
^_^
猛禽 2003-07-09
  • 打赏
  • 举报
回复
不是偶打击你,这种东东一般公司如果需要都是自己写DI。

其实那个网络狗比单机狗难用多了(那个鬼服务端经常连不通,不过后来据说有所改进),偶2,3年前在以前公司就是自己写的,改用单机狗DI。
shao528 2003-07-08
  • 打赏
  • 举报
回复
implementation


function TNetSoftDog.TestIp(IP:string): boolean;
var
WSAData:TWSADATA;
Addr:DWORD;
begin
WSAStartup(2, WSAData);
Addr:=inet_addr(PChar(IP));
if gethostbyaddr(@Addr,sizeof(Addr),PF_INET)=nil then
result:= false
else result:= true;
WSACleanup();
end;

function TNetSoftDog.TestHost(AHost :string) : boolean;
var
WSAData:TWSADATA;
begin
WSAStartup(2, WSAData);
if GetHostByName(PChar(AHost))=nil then
result:= false
else result:= true;
WSACleanup();
end;

constructor TNetSoftDog.Create(AHost, AHostIp :string; APort :integer);

function IsIpAddr(AIPStr :string) :boolean;
var i,k:integer;
begin
k := 0;
if trim(AIpStr) <>'' then
begin
for i:= 0 to length(AIPStr) do
begin
if (AIPStr[i] <'0') and (AIPStr[i]>'9') and (AIPStr[i] <>'.') then
begin
result := false;
Exit;
end;
if (AIPStr[i] = '.') then k := k +1;
end;
if k <>3 then
begin
Result := false;
Exit;
end;
Result := true;
end;
end;
begin
inherited Create;
FHost := AHost;
FHostIp := AHostIp;

FClientSocket := TClientSocket.Create(nil);
FClientSocket.ClientType := ctNonBlocking;
if (FHostIp <> '') and IsIpAddr(FHostIP) then
FClientSocket.Address := FHostIp
else
FClientSocket.Host := FHost;

FClientSocket.OnWrite := OnClientWrite;
FClientSocket.OnRead := OnClientRead;
FClientSocket.OnError := OnClientError;
FClientSocket.Port := APort;
FOpFinished := false;

FTimer := TTimer.Create(nil);
FTimer.Enabled := false;
FTimer.OnTimer := OnTimer;
end;

destructor TNetSoftDog.Destroy;
begin
if FClientSocket.Active then
FClientSocket.Active := false;
inherited;
end;

function TNetSoftDog.DoFunc :longint;
var bServerExists :boolean;
begin
try
if FClientSocket.Host <>'' then
bServerExists := TestHost(FClientSocket.Host)
else
bServerExists := TestIP(FClientSocket.Address);

if not bServerExists then //如果服务器没连网,或不存在
begin
FCommData.Result := -9;
FCommData.ErrMessage := '指定的网络狗服务器不存在或没有连网!';
Exit;
end;

if FClientSocket.Active then
OnClientWrite(FClientSocket, FClientSocket.Socket)
else
FClientSocket.Active := true;

StartTimerOut(30); //设置超时30秒

while not FOpFinished do Application.ProcessMessages;

Result := FCommData.Result;
except
FOpFinished := true;
FCommData.Result := -100;
FCommData.ErrMessage := '寻找网络软件狗失败!请注意网络连接或狗服务器设置是否正确!';
Result := FCommData.Result;
end;
end;

function TNetSoftDog.LogIn() : longint;
begin
FCommData.Command := dcLog;
result := DoFunc();
end;

function TNetSoftDog.LogOut() : longint;
begin
result := 0;
if FClientSocket.Active then
FClientSocket.Active := false;
end;

function TNetSoftDog.ReadStr(nAddr, nLen :integer;var AStr :string) :longint;
begin
FCommData.Command := dcReadStr;
FCommData.DataStr := '';
FCommData.DogAddr := nAddr;
FCommData.ByteSize := nLen;
result := DoFunc();
Astr := FCommData.DataStr;
end;

function TNetSoftDog.WriteStr(nAddr:integer; AStr :string) :longint;
begin
FCommData.Command := dcWriteStr;
FCommData.DogAddr := nAddr;
FCommData.DataStr := AStr;
Result := DoFunc();
end;

function TNetSoftDog.ReadWord(nAddr :integer; var AData :Word) :longint;
begin
FCommData.Command := dcReadWord;
FCommData.DogAddr := nAddr;
Result := DoFunc();
AData := FCommData.DataWord;
end;

function TNetSoftDog.WriteWord(nAddr :integer; AData :Word) :longint;
begin
FCommData.Command := dcWriteWord;
FCommData.DogAddr := nAddr;
FCommData.DataWord := AData;
Result := DoFunc();
end;

function TNetSoftDog.ReadFloat(nAddr :integer; var AData :Real) :longint;
begin
FCommData.Command := dcReadFloat;
FCommData.DogAddr := nAddr;
Result := DoFunc();
AData := FCommData.DataFloat;
end;

function TNetSoftDog.WriteFloat(nAddr :integer; AData :Real) :longint;
begin
FCommData.Command := dcWriteFloat;
FCommData.DogAddr := nAddr;
FCommData.DataFloat := AData;
Result := DoFunc();
end;

function TNetSoftDog.GetLinceCount(AModeNo:integer; var ALince:integer):longint;
begin
FCommData.Command := dcReadWord;
FCommData.DogAddr := $30+ 2*AModeNo; //模块号
Result := DoFunc;
ALince := FCommData.DataWord;
end;

function TNetSoftDog.AutoCheckTxDog() :longint;
begin
FCommData.Command := dcAutoCheck;
Result := DoFunc();
end;

procedure TNetSoftDog.OnClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var nByte :integer;
begin
nByte := Socket.ReceiveBuf(FCommData, sizeof(FCommData));
if (nByte <> sizeof(FCommData)) or (FCommData.FlagHeader <>111) or
(FCommData.FlagEnd <>222) then
begin
FCommData.ErrMessage := '数据块传送错误!';
FCommData.Result := -11;
end;
FOpFinished := true;
end;

procedure TNetSoftDog.OnClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
FCommData.FlagHeader := 111;
FCommData.FlagEnd := 222;
FCommData.Result := -1;
FClientSocket.Socket.SendBuf(FCommData, sizeof(FCommData));
FOpFinished := false;
end;

procedure TNetSoftDog.OnClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
FOpFinished := true;
FCommData.ErrMessage := '狗服务器未运行,或端口号设置错误!';
FCommData.Result := ErrorCode;
ErrorCode := 0;
end;

procedure TNetSoftDog.StartTimerOut(ASec :integer);
begin
FTimeOut := Asec;
FTimer.Interval := 1000;
FTimer.Enabled := true;
end;

procedure TNetSoftDog.OnTimer(Sender:TObject);
begin
if FTimeOut <=0 then
begin
if not FOpFinished then
begin
FCommData.Result := 200;
FCommData.ErrMessage := '寻找网络狗服务器超时!';
FTimer.Enabled := false;
FOpFinished := true;
end;
end
else
if FOpFinished then
FTimer.Enabled := false
else
Dec(FTimeOut);
end;

end.

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧