var Form1: TForm1;implementation{$R *.DFM} procedure TForm1.AppException (sender:TObject;E:Exception); begin // end; procedure TForm1.menuopenClick(Sender: TObject); begin serversocket1.active:=true; end;procedure TForm1.menucloseClick(Sender: TObject); begin serversocket1.Active :=false; server_enabled:=false; menuopen.Enabled :=true; btopen.Enabled :=true; menuclose.Enabled :=false; btclose.Enabled :=false; end;procedure TForm1.menuexit(Sender: TObject); begin application.Terminate ; end;procedure TForm1.FormCreate(Sender: TObject); begin server_enabled:=false; sessions:=0; invalidrequests:=0; LookupTimeOut:=60000; timer1.Enabled :=true; menuopen.Enabled :=false; btopen.Enabled :=false; menuclose.Enabled :=true; btclose.Enabled :=true; serversocket1.Port :=988; serversocket1.Active :=true; //application.OnActionExecute :=appexception;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin timer1.Enabled :=false; if server_enabled then serversocket1.Active:=false; end;procedure TForm1.ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket); begin server_enabled:=true; menuopen.Enabled :=false; btopen.Enabled :=false; menuclose.Enabled :=true; btclose.Enabled :=true; end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); var i,j:integer; begin j:=-1; for i:=1 to sessions do if not session[i-1].Used and not session[i-1].CSocket.active then begin j:=i-1; session[j].Used :=true; break; end else if not session[i-1].Used and session[i-1].CSocket.active then session[j].CSocket .active:=false ; if j=-1 then begin j:=sessions; inc(sessions); setlength(session,sessions); session[j].Used :=true; session[j].CSocket :=Tclientsocket.Create (nil); session[j].CSocket.onconnect:=clientsocket1connect; session[j].CSocket.ondisconnect:=clientsocket1disconnect; session[j].CSocket.onerror:=clientsocket1error; session[j].CSocket.onread:=clientsocket1read; session[j].CSocket .onwrite:=clientsocket1write; session[j].CSocket .onlookup:=clientsocket1lookup; session[j].CSocket .onconnecting:=clientsocket1connecting; session[j].lookingup:=false; end; session[j].SS_Handle :=socket.SocketHandle ; session[j].Request :=false; session[j].client_connected :=true; session[j].remote_connected :=false; edit1.Text :=inttostr(sessions); end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); var i,j,k:integer; begin for i:=1 to sessions do if (session[i-1].SS_Handle =socket.sockethandle) and session[i-1].Used then begin session[i-1].client_connected :=false; if session[i-1].remote_connected then session[i-1].CSocket.active:=false else session[i-1].Used :=false; break; end; j:=sessions; k:=0; for i:=1 to j do begin if session[j-i].Used then break; inc(k); end; if k>0 then begin sessions:=sessions-k; setlength(session,sessions); end; edit1.Text :=inttostr(sessions); end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); var i:integer; begin for i:=1 to sessions do if (session[i-1].Csocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used then begin session[i-1].CSocket.tag:=socket.sockethandle; session[i-1].remote_connected :=true; session[i-1].Lookingup :=false; break; end; end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); var i,j,k:integer; begin for i:=1 to sessions do if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then begin session[i-1].remote_connected :=false; if not session[i-1].client_connected then session[i-1].Used :=false else for k:=1 to serversocket1.Socket.ActiveConnections do if (serversocket1.Socket.Connections [k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then begin serversocket1.Socket.Connections[k-1].Close ; break; end; break; end; j:=sessions; k:=0; for i:=1 to j do begin if session[j-i].Used then break; inc(k); end; if k>0 then begin sessions:=sessions-k; setlength(session,sessions); end; edit1.text:=inttostr(sessions); end;procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); var i,j,k:integer; begin for i:=1 to sessions do if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then begin socket.Close ; session[i-1].remote_connected :=false; if not session[i-1].client_connected then session[i-1].Used :=false else for k:=1 to serversocket1.Socket.ActiveConnections do if (serversocket1.Socket.Connections[k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then begin serversocket1.Socket.Connections [k-1].Close; break; end; break; end; j:=sessions; k:=0; for i:=1 to j do begin if session[j-i].Used then break; inc(k); end; errorcode:=0; if k>0 then begin sessions:=sessions-k; setlength(session,sessions); end; edit1.Text :=inttostr(sessions); end;procedure TForm1.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket); var i:integer; begin for i:=1 to sessions do if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then begin if session[i-1].Request then begin socket.SendText(session[i-1].request_str); session[i-1].Request :=false; end; break; end; end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var i,j,rec_bytes:integer; rec_buffer:array[0..2047] of char; begin for i:=1 to sessions do if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].used then begin rec_bytes:=socket.ReceiveBuf (rec_buffer,2048); for j:=1 to serversocket1.Socket.ActiveConnections do if serversocket1.Socket.Connections [j-1].SocketHandle =session[i-1].SS_Handle then begin serversocket1.Socket.Connections [j-1].SendBuf (rec_buffer,rec_bytes); break; end; break; end; end;procedure TForm1.Timer1Timer(Sender: TObject); var i,j:integer; begin for i:=1 to sessions do if session[i-1].Used and session[i-1].Lookingup then begin inc(session[i-1].LookupTime ); if session[i-1].LookupTime >lookuptimeout then begin session[i-1].Lookingup :=false; session[i-1].CSocket.active:=false; for j:=1 to serversocket1.socket.activeconnections do if serversocket1.Socket.Connections[j-1].sockethandle=session[i-1].ss_handle then begin serversocket1.socket.connections[j-1].close; break; end; end; end;end; procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); var i,j,k:integer; begin for i:=1 to sessions do if (session[i-1].SS_Handle=socket.sockethandle) and session[i-1].Used then begin session[i-1].client_connected:=false; if session[i-1].remote_connected then session[i-1].CSocket.active:=false else session[i-1].Used:=false; break; end; j:=sessions; k:=0; for i:=1 to j do begin if session[j-i].Used then break; inc(k); end; if k>0 then begin sessions:=sessions-k; setlength(session,sessions); end; edit1.text:=inttostr(sessions); errorcode:=0; end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var tmp,line,host:string; i,j,port:integer; begin for i:=1 to sessions do if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) then begin session[i-1].request_str:=socket.receivetext; tmp:=session[i-1].request_str; memo1.lines.add(tmp); j:=pos(char(13)+char(10),tmp); while j>0 do begin line:=copy(tmp,1,j-1); delete(tmp,1,j+1); j:=pos('Host',line); if j>0 then begin delete(line,1,j+5); j:=pos(':',line); if j>0 then begin host:=copy(line,1,j-1); delete(line,1,j-1); try port:=strtoint(line); except port:=80 end; end else begin host:=trim(line); port:=80; end; if not session[i-1].remote_connected then begin session[i-1].request:=true; session[i-1].CSocket.host:=host; session[i-1].CSocket.port:=port; session[i-1].CSocket.active:=true; session[i-1].lookingup:=true; session[i-1].lookuptime:=0; end else session[i-1].Csocket.socket.sendtext(session[i-1].request_str); break; end; j:=pos(char(13)+char(10),tmp); end; break; end; end; procedure TForm1.N4Click(Sender: TObject); begin form1.Show; end;procedure TForm1.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin form1.Show; end;procedure TForm1.ClientSocket1Lookup(Sender: TObject; Socket: TCustomWinSocket); begin // end;procedure TForm1.bthideClick(Sender: TObject); begin form1.Hide ; end;procedure TForm1.menuhideClick(Sender: TObject); begin form1.Hide ; end;procedure TForm1.Timer2Timer(Sender: TObject); begin if form1.WindowState =wsminimized then showmessage('aaaa'); end;procedure TForm1.Button1Click(Sender: TObject); begin form1.WindowState :=wsminimized; end;procedure TForm1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket); begin // end;end.
如果你想获取IE浏览器所发送的IP地址 可以使用IE的DISPATCH接口 用COM的扩展 unit IEHelperUnit;interfaceuses Windows, ActiveX, Classes, ComObj,SHDOCVW,MSHTML,Dialogs;type TIEHelperFactory = class(TComObjectFactory) private procedure AddKeys; procedure RemoveKeys; public procedure UpdateRegistry(Register:Boolean);override; end; TIEHelper = class(TComObject, Idispatch, IObjectwithSite) public function GetTypeInfoCount(out Count:Integer):HResult;stdcall; function GetTypeInfo(Index,LocaleID:integer;out TypeInfo):HResult;stdcall; function GetIDsOfNames(const IID:TGUID;Names:Pointer; NameCount,LocaleID:Integer;DispIDs:Pointer):HResult;stdcall; function Invoke(DispID:Integer;const IID:TGUID;LocaleID:Integer; Flags:Word;var Params; VarResult,ExcepInfo,ArgErr:Pointer):HResult;stdcall; function SetSite(const pUnkSite:IUnknown):HResult;stdcall; function GetSite(const riid:TIID;out site:IUnknown):HResult;stdcall; {Declare Idispatch methods here} {Declare IObjectwithSite methods here} private IE:IWebbrowser2; Cookie:Integer; end;const Class_IEHelper: TGUID = '{6224A5C9-D87D-4926-8522-FF26D6790518}';implementationuses ComServ,SysUtils,Registry;procedure DoStatusTextChange(const Text:WideString); begin // //ShowMessage(''); end;procedure DoProgressChange(Progress:Integer;ProgressMax:Integer); begin // //ShowMessage(''); end;procedure DoCommandStateChange(Command:Integer;Eable:WordBool); begin // //ShowMessage(''); end;procedure DoDownloadBegin; begin // //ShowMessage(''); end;procedure DoDownloadComplete; begin // //ShowMessage(''); end;procedure DoTitleChange(const Text:WideString); begin // //ShowMessage(''); end;procedure DoPropertyChange(const szProperty:WideString); begin // //ShowMessage(''); end;procedure DoBeforeNavigate2(const pDisp:IDispatch;var URL:OleVariant; var Flags:Olevariant;var TargetFrameName:OleVariant;var PostData:OleVariant; var Headers:Olevariant;var Cancel:WordBool); begin if URL='http://www.sex.com' then begin ShowMessage('对不起!该站点已被管理员禁止!!'); Cancel:=True; Url:='http://wwwbird/class'; (pDisp as IWebbrowser2).Navigate2(URL,Flags,TargetFrameName,PostData,Headers); end; end;procedure DoNewWindow2(var ppDisp:IDispatch;var Cancel:WordBool); begin // ShowMessage(''); end;procedure DoNavigateComplete2(const pDisp:IDispatch;var URL:OleVariant); begin // end;procedure DoDocumentComplete(const pDisp:IDispatch;var URL:OleVariant); begin // end;procedure DoOnQuit; begin // end;procedure DoOnVisible(Visible:WordBool); begin // end;procedure BuildPositionalDispIds(pDispIds:PDispIdList;const dps:TDispParams); var i:integer; begin Assert(pDispIds<>nil); for i:=0 to dps.cArgs-1 do pDispIds^[i]:=dps.cArgs-1-i; if(dps.cNamedArgs<=0) then Exit; for i:=0 to dps.cNamedArgs-1 do pDispIds^[dps.rgdispidNamedArgs^[i]]:=i; end;function TIEHelper.GetTypeInfoCount(out Count:Integer):HResult; begin Result:=E_NOTIMPL; Count:=0; end;function TIEHelper.GetTypeInfo(Index,LocaleID:integer;out TypeInfo):HResult; begin Result:=E_NOTIMPL; pointer(TypeInfo):=nil; end;function TIEHelper.GetIDsOfNames(const IID:TGUID;Names:Pointer; NameCount,LocaleID:Integer;DispIDs:Pointer):HResult; begin Result:=E_NOTIMPL; end;function TIEHelper.Invoke(DispID:Integer;const IID:TGUID;LocaleID:Integer; Flags:Word;var Params; VarResult,ExcepInfo,ArgErr:Pointer):HResult; type POleVariant = ^OleVariant; var dps:TDispParams absolute Params; bHasParams:boolean; pDispIds:PDispIdList; iDispIdsSize:integer; begin Result:=DISP_E_MEMBERNOTFOUND; pDispIds:=nil; iDispIdsSize:=0; bHasParams:=(dps.cArgs>0); if (bHasParams)then begin iDispIdsSize:=dps.cArgs*SizeOf(TDispId); GetMem(pDispIds,iDispIdsSize); end; try If(bHasParams)then BuildPositionalDispIds(pDispIds,dps); case DispId of 102: begin DoStatusTextChange(dps.rgvarg^[pDispIds^[0]].bstrVal); Result:=S_OK; end; 250: begin DoBeforeNavigate2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispVal), POleVariant(dps.rgvarg^[pDispIds^[1]].pvarVal)^, POleVariant(dps.rgvarg^[pDispIds^[2]].pvarVal)^, POleVariant(dps.rgvarg^[pDispIds^[3]].pvarVal)^, POleVariant(dps.rgvarg^[pDispIds^[4]].pvarVal)^, POleVariant(dps.rgvarg^[pDispIds^[5]].pvarVal)^, dps.rgvarg^[pDispIds^[6]].pbool^); Result:=S_OK; end; end; finally if(bHasParams)then FreeMem(pDispIds,iDispIdsSize); end;end;function TIEHelper.SetSite(const pUnkSite:IUnknown):HResult; var cmdTarget:IOleCommandTarget; Sp:IServiceProvider; CPC:IConnectionPointContainer; CP:IConnectionPoint; begin If Assigned(pUnkSite) then begin cmdTarget:=pUnkSite as IOleCommandTarget; Sp:=CmdTarget as IServiceProvider; if Assigned(Sp) then Sp.QueryService(IWebbrowserApp,IWebbrowser2,IE); If Assigned(IE) then begin IE.QueryInterface(IConnectionPointContainer,CPC); CPC.FindConnectionPoint(DWEBbrowserEventS2,CP); CP.Advise(Self,Cookie); end; end; Result:=S_OK; end;function TIEHelper.GetSite(const riid:TIID;out site:IUnknown):HResult; begin if Assigned(IE) then Result:=IE.QueryInterface(riid,site) else Result:=E_FAIL; end;procedure TIEHelperFactory.AddKeys; VAR S:string; begin S:=GUIDToString(CLASS_IEHelper); //{6224A5C9-D87D-4926-8522-FF26D6790518} With TRegistry.Create do begin try RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\'+S,true) then CloseKey; finally free; end; end; end;procedure TIEHelperFactory.RemoveKeys; VAR S:string; begin S:=GUIDToString(CLASS_IEHelper); With TRegistry.Create do begin try RootKey:=HKEY_LOCAL_MACHINE; DeleteKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\'+S); finally free; end; end; end;procedure TIEHelperFactory.UpdateRegistry(Register:Boolean); begin inherited UpdateRegistry(Register); //Addkeys; if Register then Addkeys else RemoveKeys; end;initialization TComObjectFactory.Create(ComServer, TIEHelper, Class_IEHelper, 'IEHelper', '', ciMultiInstance, tmApartment); end.
所有输入IE的网址 将会调用 procedure DoBeforeNavigate2(const pDisp:IDispatch;var URL:OleVariant; var Flags:Olevariant;var TargetFrameName:OleVariant;var PostData:OleVariant; var Headers:Olevariant;var Cancel:WordBool); begin if URL='http://www.sex.com' then begin ShowMessage('对不起!该站点已被管理员禁止!!'); Cancel:=True; Url:='http://wwwbird/class'; (pDisp as IWebbrowser2).Navigate2(URL,Flags,TargetFrameName,PostData,Headers); end; end; 此过程
to lzbug(lanchong) 这个控件可以非常简单的做到你要求的那些东西,他的帮助和例子我觉得非常清晰了, 如果你看他的帮助还看不明白,你的学习能力就该检讨了。
我写过一个针对 bbs.mydrivers.com ,通过修改数据包,我的虚拟货币现在多的吓人了。
有谁知道本地代理服务器怎么写啊
有代码的话 email给我谢谢了,一定加分
email:[email protected]
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RXShell, Menus, StdCtrls, ExtCtrls, ScktComp;
type
session_record=record
Used:boolean;
SS_Handle:integer;
CSocket:Tclientsocket;
Lookingup:boolean;
LookupTime:integer;
Request:boolean;
request_str:string;
client_connected:boolean;
remote_connected:boolean;
end;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
ClientSocket1: TClientSocket;
Timer1: TTimer;
Label1: TLabel;
Edit1: TEdit;
Memo1: TMemo;
PopupMenu1: TPopupMenu;
menuopen: TMenuItem;
menuclose: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
RxTrayIcon1: TRxTrayIcon;
N3: TMenuItem;
N4: TMenuItem;
btopen: TButton;
btclose: TButton;
Button3: TButton;
bthide: TButton;
menuhide: TMenuItem;
Button1: TButton;
procedure AppException(sender:TObject;e:Exception);
procedure menuopenClick(Sender: TObject);
procedure menucloseClick(Sender: TObject);
procedure menuexit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
procedure bthideClick(Sender: TObject);
procedure menuhideClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
Server_Enabled:boolean;
session:array of session_record;
sessions:integer;
LookupTimeOut:integer;
InvalidRequests:integer;
end;
Form1: TForm1;implementation{$R *.DFM}
procedure TForm1.AppException (sender:TObject;E:Exception);
begin
//
end;
procedure TForm1.menuopenClick(Sender: TObject);
begin
serversocket1.active:=true;
end;procedure TForm1.menucloseClick(Sender: TObject);
begin
serversocket1.Active :=false;
server_enabled:=false;
menuopen.Enabled :=true;
btopen.Enabled :=true;
menuclose.Enabled :=false;
btclose.Enabled :=false;
end;procedure TForm1.menuexit(Sender: TObject);
begin
application.Terminate ;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
server_enabled:=false;
sessions:=0;
invalidrequests:=0;
LookupTimeOut:=60000;
timer1.Enabled :=true;
menuopen.Enabled :=false;
btopen.Enabled :=false;
menuclose.Enabled :=true;
btclose.Enabled :=true;
serversocket1.Port :=988;
serversocket1.Active :=true;
//application.OnActionExecute :=appexception;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
timer1.Enabled :=false;
if server_enabled then serversocket1.Active:=false;
end;procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
begin
server_enabled:=true;
menuopen.Enabled :=false;
btopen.Enabled :=false;
menuclose.Enabled :=true;
btclose.Enabled :=true;
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var i,j:integer;
begin
j:=-1;
for i:=1 to sessions do
if not session[i-1].Used and not session[i-1].CSocket.active then
begin
j:=i-1;
session[j].Used :=true;
break;
end
else
if not session[i-1].Used and session[i-1].CSocket.active then session[j].CSocket .active:=false ;
if j=-1 then
begin
j:=sessions;
inc(sessions);
setlength(session,sessions);
session[j].Used :=true;
session[j].CSocket :=Tclientsocket.Create (nil);
session[j].CSocket.onconnect:=clientsocket1connect;
session[j].CSocket.ondisconnect:=clientsocket1disconnect;
session[j].CSocket.onerror:=clientsocket1error;
session[j].CSocket.onread:=clientsocket1read;
session[j].CSocket .onwrite:=clientsocket1write;
session[j].CSocket .onlookup:=clientsocket1lookup;
session[j].CSocket .onconnecting:=clientsocket1connecting;
session[j].lookingup:=false;
end;
session[j].SS_Handle :=socket.SocketHandle ;
session[j].Request :=false;
session[j].client_connected :=true;
session[j].remote_connected :=false;
edit1.Text :=inttostr(sessions);
end;
Socket: TCustomWinSocket);
var i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].SS_Handle =socket.sockethandle) and session[i-1].Used then
begin
session[i-1].client_connected :=false;
if session[i-1].remote_connected then
session[i-1].CSocket.active:=false
else
session[i-1].Used :=false;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.Text :=inttostr(sessions);
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
for i:=1 to sessions do
if (session[i-1].Csocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used then
begin
session[i-1].CSocket.tag:=socket.sockethandle;
session[i-1].remote_connected :=true;
session[i-1].Lookingup :=false;
break;
end;
end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
session[i-1].remote_connected :=false;
if not session[i-1].client_connected then
session[i-1].Used :=false
else
for k:=1 to serversocket1.Socket.ActiveConnections do
if (serversocket1.Socket.Connections [k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then
begin
serversocket1.Socket.Connections[k-1].Close ;
break;
end;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.text:=inttostr(sessions);
end;procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var
i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
socket.Close ;
session[i-1].remote_connected :=false;
if not session[i-1].client_connected then
session[i-1].Used :=false
else
for k:=1 to serversocket1.Socket.ActiveConnections do
if (serversocket1.Socket.Connections[k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then
begin
serversocket1.Socket.Connections [k-1].Close;
break;
end;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
errorcode:=0;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.Text :=inttostr(sessions);
end;procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
if session[i-1].Request then
begin
socket.SendText(session[i-1].request_str);
session[i-1].Request :=false;
end;
break;
end;
end;
Socket: TCustomWinSocket);
var
i,j,rec_bytes:integer;
rec_buffer:array[0..2047] of char;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].used then
begin
rec_bytes:=socket.ReceiveBuf (rec_buffer,2048);
for j:=1 to serversocket1.Socket.ActiveConnections do
if serversocket1.Socket.Connections [j-1].SocketHandle =session[i-1].SS_Handle then
begin
serversocket1.Socket.Connections [j-1].SendBuf (rec_buffer,rec_bytes);
break;
end;
break;
end;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to sessions do
if session[i-1].Used and session[i-1].Lookingup then
begin
inc(session[i-1].LookupTime );
if session[i-1].LookupTime >lookuptimeout then
begin
session[i-1].Lookingup :=false;
session[i-1].CSocket.active:=false;
for j:=1 to serversocket1.socket.activeconnections do
if serversocket1.Socket.Connections[j-1].sockethandle=session[i-1].ss_handle then
begin
serversocket1.socket.connections[j-1].close;
break;
end;
end;
end;end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].SS_Handle=socket.sockethandle) and session[i-1].Used then
begin
session[i-1].client_connected:=false;
if session[i-1].remote_connected then
session[i-1].CSocket.active:=false
else
session[i-1].Used:=false;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.text:=inttostr(sessions);
errorcode:=0;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmp,line,host:string;
i,j,port:integer;
begin
for i:=1 to sessions do
if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) then
begin
session[i-1].request_str:=socket.receivetext;
tmp:=session[i-1].request_str;
memo1.lines.add(tmp);
j:=pos(char(13)+char(10),tmp);
while j>0 do begin
line:=copy(tmp,1,j-1);
delete(tmp,1,j+1);
j:=pos('Host',line);
if j>0 then
begin
delete(line,1,j+5);
j:=pos(':',line);
if j>0 then
begin
host:=copy(line,1,j-1);
delete(line,1,j-1);
try
port:=strtoint(line);
except
port:=80
end;
end
else
begin
host:=trim(line);
port:=80;
end;
if not session[i-1].remote_connected then
begin
session[i-1].request:=true;
session[i-1].CSocket.host:=host;
session[i-1].CSocket.port:=port;
session[i-1].CSocket.active:=true;
session[i-1].lookingup:=true;
session[i-1].lookuptime:=0;
end
else
session[i-1].Csocket.socket.sendtext(session[i-1].request_str);
break;
end;
j:=pos(char(13)+char(10),tmp);
end;
break;
end;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
form1.Show;
end;procedure TForm1.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
form1.Show;
end;procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
end;procedure TForm1.bthideClick(Sender: TObject);
begin
form1.Hide ;
end;procedure TForm1.menuhideClick(Sender: TObject);
begin
form1.Hide ;
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
if form1.WindowState =wsminimized then showmessage('aaaa');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
form1.WindowState :=wsminimized;
end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
end;end.
利用了IdMappedPortTCP控件,非常简单,只有几行代码,
我修改了一下,让他可以显示和修改发送和接受的数据。
这个一点不懂,希望大哥们多多帮忙啊!我再把问题说一边 希望大家能我点帮助我的问题是:如何判断浏览器索要浏览的地址是否符合我的要求,如果符合就放行,不符就阻断;这样是不是要先截取IP地址进行比较 如:123.123.123.123是可以通过的,在IE浏览器中输入123.123.123.123则可以放行打开123.123.123.123的网页,如果输入别的地址就显示不能连接。需要用程序实现,怎么写啊?小弟不懂,望大哥们帮忙小弟! 十万份的感谢!!!
TRxTrayIcon是个什么控件 我没用到过,我在控件栏里也没找到
用COM的扩展
unit IEHelperUnit;interfaceuses
Windows, ActiveX, Classes, ComObj,SHDOCVW,MSHTML,Dialogs;type
TIEHelperFactory = class(TComObjectFactory)
private
procedure AddKeys;
procedure RemoveKeys;
public
procedure UpdateRegistry(Register:Boolean);override;
end;
TIEHelper = class(TComObject, Idispatch, IObjectwithSite)
public
function GetTypeInfoCount(out Count:Integer):HResult;stdcall;
function GetTypeInfo(Index,LocaleID:integer;out TypeInfo):HResult;stdcall;
function GetIDsOfNames(const IID:TGUID;Names:Pointer;
NameCount,LocaleID:Integer;DispIDs:Pointer):HResult;stdcall;
function Invoke(DispID:Integer;const IID:TGUID;LocaleID:Integer;
Flags:Word;var Params; VarResult,ExcepInfo,ArgErr:Pointer):HResult;stdcall;
function SetSite(const pUnkSite:IUnknown):HResult;stdcall;
function GetSite(const riid:TIID;out site:IUnknown):HResult;stdcall;
{Declare Idispatch methods here}
{Declare IObjectwithSite methods here}
private
IE:IWebbrowser2;
Cookie:Integer;
end;const
Class_IEHelper: TGUID = '{6224A5C9-D87D-4926-8522-FF26D6790518}';implementationuses ComServ,SysUtils,Registry;procedure DoStatusTextChange(const Text:WideString);
begin
//
//ShowMessage('');
end;procedure DoProgressChange(Progress:Integer;ProgressMax:Integer);
begin
//
//ShowMessage('');
end;procedure DoCommandStateChange(Command:Integer;Eable:WordBool);
begin
//
//ShowMessage('');
end;procedure DoDownloadBegin;
begin
//
//ShowMessage('');
end;procedure DoDownloadComplete;
begin
//
//ShowMessage('');
end;procedure DoTitleChange(const Text:WideString);
begin
//
//ShowMessage('');
end;procedure DoPropertyChange(const szProperty:WideString);
begin
//
//ShowMessage('');
end;procedure DoBeforeNavigate2(const pDisp:IDispatch;var URL:OleVariant;
var Flags:Olevariant;var TargetFrameName:OleVariant;var PostData:OleVariant;
var Headers:Olevariant;var Cancel:WordBool);
begin
if URL='http://www.sex.com' then
begin
ShowMessage('对不起!该站点已被管理员禁止!!');
Cancel:=True;
Url:='http://wwwbird/class';
(pDisp as IWebbrowser2).Navigate2(URL,Flags,TargetFrameName,PostData,Headers);
end;
end;procedure DoNewWindow2(var ppDisp:IDispatch;var Cancel:WordBool);
begin
// ShowMessage('');
end;procedure DoNavigateComplete2(const pDisp:IDispatch;var URL:OleVariant);
begin
//
end;procedure DoDocumentComplete(const pDisp:IDispatch;var URL:OleVariant);
begin
//
end;procedure DoOnQuit;
begin
//
end;procedure DoOnVisible(Visible:WordBool);
begin
//
end;procedure BuildPositionalDispIds(pDispIds:PDispIdList;const dps:TDispParams);
var
i:integer;
begin
Assert(pDispIds<>nil);
for i:=0 to dps.cArgs-1 do
pDispIds^[i]:=dps.cArgs-1-i;
if(dps.cNamedArgs<=0) then Exit;
for i:=0 to dps.cNamedArgs-1 do
pDispIds^[dps.rgdispidNamedArgs^[i]]:=i;
end;function TIEHelper.GetTypeInfoCount(out Count:Integer):HResult;
begin
Result:=E_NOTIMPL;
Count:=0;
end;function TIEHelper.GetTypeInfo(Index,LocaleID:integer;out TypeInfo):HResult;
begin
Result:=E_NOTIMPL;
pointer(TypeInfo):=nil;
end;function TIEHelper.GetIDsOfNames(const IID:TGUID;Names:Pointer;
NameCount,LocaleID:Integer;DispIDs:Pointer):HResult;
begin
Result:=E_NOTIMPL;
end;function TIEHelper.Invoke(DispID:Integer;const IID:TGUID;LocaleID:Integer;
Flags:Word;var Params; VarResult,ExcepInfo,ArgErr:Pointer):HResult;
type
POleVariant = ^OleVariant;
var
dps:TDispParams absolute Params;
bHasParams:boolean;
pDispIds:PDispIdList;
iDispIdsSize:integer;
begin
Result:=DISP_E_MEMBERNOTFOUND;
pDispIds:=nil;
iDispIdsSize:=0;
bHasParams:=(dps.cArgs>0);
if (bHasParams)then
begin
iDispIdsSize:=dps.cArgs*SizeOf(TDispId);
GetMem(pDispIds,iDispIdsSize);
end;
try
If(bHasParams)then BuildPositionalDispIds(pDispIds,dps);
case DispId of
102:
begin
DoStatusTextChange(dps.rgvarg^[pDispIds^[0]].bstrVal);
Result:=S_OK;
end;
250:
begin
DoBeforeNavigate2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispVal),
POleVariant(dps.rgvarg^[pDispIds^[1]].pvarVal)^,
POleVariant(dps.rgvarg^[pDispIds^[2]].pvarVal)^,
POleVariant(dps.rgvarg^[pDispIds^[3]].pvarVal)^,
POleVariant(dps.rgvarg^[pDispIds^[4]].pvarVal)^,
POleVariant(dps.rgvarg^[pDispIds^[5]].pvarVal)^,
dps.rgvarg^[pDispIds^[6]].pbool^);
Result:=S_OK;
end;
end;
finally
if(bHasParams)then FreeMem(pDispIds,iDispIdsSize);
end;end;function TIEHelper.SetSite(const pUnkSite:IUnknown):HResult;
var
cmdTarget:IOleCommandTarget;
Sp:IServiceProvider;
CPC:IConnectionPointContainer;
CP:IConnectionPoint;
begin
If Assigned(pUnkSite) then
begin
cmdTarget:=pUnkSite as IOleCommandTarget;
Sp:=CmdTarget as IServiceProvider;
if Assigned(Sp) then
Sp.QueryService(IWebbrowserApp,IWebbrowser2,IE);
If Assigned(IE) then
begin
IE.QueryInterface(IConnectionPointContainer,CPC);
CPC.FindConnectionPoint(DWEBbrowserEventS2,CP);
CP.Advise(Self,Cookie);
end;
end;
Result:=S_OK;
end;function TIEHelper.GetSite(const riid:TIID;out site:IUnknown):HResult;
begin if Assigned(IE) then Result:=IE.QueryInterface(riid,site)
else
Result:=E_FAIL;
end;procedure TIEHelperFactory.AddKeys;
VAR
S:string;
begin
S:=GUIDToString(CLASS_IEHelper);
//{6224A5C9-D87D-4926-8522-FF26D6790518}
With TRegistry.Create do
begin
try
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\'+S,true) then CloseKey;
finally
free;
end;
end;
end;procedure TIEHelperFactory.RemoveKeys;
VAR
S:string;
begin
S:=GUIDToString(CLASS_IEHelper);
With TRegistry.Create do
begin
try
RootKey:=HKEY_LOCAL_MACHINE;
DeleteKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\'+S);
finally
free;
end;
end;
end;procedure TIEHelperFactory.UpdateRegistry(Register:Boolean);
begin
inherited UpdateRegistry(Register);
//Addkeys;
if Register then Addkeys else RemoveKeys;
end;initialization
TComObjectFactory.Create(ComServer, TIEHelper, Class_IEHelper,
'IEHelper', '', ciMultiInstance, tmApartment);
end.
procedure DoBeforeNavigate2(const pDisp:IDispatch;var URL:OleVariant;
var Flags:Olevariant;var TargetFrameName:OleVariant;var PostData:OleVariant;
var Headers:Olevariant;var Cancel:WordBool);
begin
if URL='http://www.sex.com' then
begin
ShowMessage('对不起!该站点已被管理员禁止!!');
Cancel:=True;
Url:='http://wwwbird/class';
(pDisp as IWebbrowser2).Navigate2(URL,Flags,TargetFrameName,PostData,Headers);
end;
end;
此过程
如果你看他的帮助还看不明白,你的学习能力就该检讨了。