⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmainform.pas

📁 < Delphi网络通信协议分析与应用实现>>一书的源代码。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
            memo1.Lines.Add(datetimetostr(now)+
            '来自IP:'+socket.RemoteAddress+'的请求');
            memo1.Lines.Add('--------------------------');
            memo1.lines.add(tmp);
            //首先看连接的客户端是否被认证
            if session[i-1].IsAuth=false then
            begin
                socket.SendText('HTTP/1.1 401 forbidden'#13#10+
                'Content-Type: text/html'#13#10#13#10);
                socket.SendText('<html><h1>你的IP未取得授权,不能通过代理访问<h1></html>');
                socket.close();
                exit;
                break;
            end;

            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);
                        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;          {从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;
end;

procedure TMainForm.ProxyCltSkt1Connect(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 TMainForm.ProxyCltSkt1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
    for i:=1 to sessions do
    begin
        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 ProxySerSkt1.Socket.ActiveConnections do
                if (ProxySerSkt1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                begin
                    ProxySerSkt1.Socket.Connections[k-1].Close;
                    break;
                end;
            break;
       end;
    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 TMainForm.ProxyCltSkt1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
i,j,k: integer;
begin
    for i:=1 to sessions do
    begin
        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 ProxySerSkt1.Socket.ActiveConnections do
                if (ProxySerSkt1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                begin
                    ProxySerSkt1.Socket.Connections[k-1].Close;
                    break;
                end;
            break;
         end;
    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 TMainForm.ProxyCltSkt1Write(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: integer;
begin
    for i:=1 to sessions do
    begin
        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;
end;

procedure TMainForm.ProxyCltSkt1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j: integer;
rec_bytes: integer;                  {传回的数据块长度}
rec_Buffer: array[0..2047] of char;  {传回的数据块缓冲区}
begin
    for i:=1 to sessions do
    begin
        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 ProxySerSkt1.Socket.ActiveConnections do
            begin
                if ProxySerSkt1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                begin
                    ProxySerSkt1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes);  {发送数据}
                    break;
                end;
            end;
            break;
        end;
    end;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
var
i,j: integer;
begin
    for i:=1 to sessions do
    begin
        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 ProxySerSkt1.Socket.ActiveConnections do
                begin
                    if ProxySerSkt1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                    begin
                        ProxySerSkt1.Socket.Connections[j-1].Close;  {断开客户机}
                        break;
                    end;
                end;
            end;
         end;
   end;
end;
procedure TMainForm.AppException(Sender: TObject; E: Exception);
begin
    inc(invalidrequests);
end;

function TMainForm.CheckIP(IP:string):boolean;
var
i:integer;
begin
    for i:=0 to userform.iplist.Count-1 do
    begin
        if userform.IPlist.Strings[i]=IP then
        begin
            result:=true;
            exit;
        end;
    end;
    result:=false;
end;

procedure TMainForm.N4Click(Sender: TObject);
begin
    UserForm.showmodal;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -