Neo | Дата: Вторник, 01.10.2013, 18:25 | Сообщение # 1 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Всем привет, вот написал я данный проксик, он работает,когда данные не большие гоняются,а когда зафигичишь раузер,то не работает.В чём может быть трабла???
Код unit TProxiUnit;
interface uses Windows,Winsock; function GetTextBetweenTags(headers: PChar): string; function GetIP(Host: String): string; type TPROXI = class private WS:TwsaData; public Sock: TSocket; hAddr: TSockAddr; Host :PChar; Port :Word; Data: Pointer;
constructor Create(Port_: Word); procedure Send_(Date: Pointer); Procedure Recv_; destructor destroy; end;
implementation
function GetIP(Host: String): string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; I : Integer; GInitData : TWSADATA; begin WSAStartup(MakeWord(2,0), GInitData); Result := ''; //не найден! ZeroMemory(@Buffer, SizeOf(Buffer)); lstrcpy(Buffer, PChar(Host)); phe :=GetHostByName(buffer); if phe = nil then begin WSACleanup; Exit; end; try pptr := PaPInAddr(Phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin result:=PChar(inet_ntoa(pptr^[I]^)); Inc(I); end; finally WSACleanup; end; end;
function GetTextBetweenTags(headers: PChar): string; const ctrf = #13#10; Var i,j: integer; begin Result:=''; i:= Pos('Host:',headers)+5; if i <6 then Exit; j:=i; repeat Result:=Result+Headers[j]; Inc(j); until headers[j] = #13; end;
Procedure Colors(Red: boolean); Var hCon: DWORD; begin hCon := GetStdHandle(STD_OUTPUT_HANDLE); if Red then SetConsoleTextAttribute(hCon, 7) else SetConsoleTextAttribute(hCon, 3); end;
procedure THREAD(P :Pointer); stdcall; const PPORT = 80; ctrf = #13#10; Var Ns: TSocket; i,j: integer; Data,Tmp: array[0..8*MAX_PATH] of char;
addr: TSockAddr; Snd: TSocket; host: string; Str: string; //TimeVal: TTimeVal; //FDSet: TFDSet; begin Ns:=TSocket(P); WriteLn(Ns); { FD_ZERO(FDSet); FD_SET(Ns, FDSet); TimeVal.tv_sec := 0; TimeVal.tv_usec := 500; ioctlsocket(Ns,FIONREAD,i);} while true do begin Str:=''; i:=1; while i>0 do begin //Читаю данные с клиента ZeroMemory(@Data,SizeOf(Data)); i:=recv(Ns,Data,SizeOf(Data),0); Str:=Str+Data; end; WriteLn(Str); host:=GetTextBetweenTags(PChar(Str)); host:=GetIP(host); //Определил IP куда хотел подконектиться клиент Addr.sin_family:=PF_INET; Addr.sin_port:=htons(PPORT); Addr.sin_addr.S_addr:=inet_addr(PChar(host)); Snd := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP); if connect(Snd,addr,SizeOf(Addr)) = 0 then begin j:=1; while j>0 do j:=send(Snd,Str[1],Length(Str),0); //Посылаю вопрос серверу Str:=''; j:=1; //Читаю ответ с сервера while j>0 do begin ZeroMemory(@Tmp,SizeOf(Tmp)); j:=recv(Snd,Tmp,SizeOf(Tmp),0); Str:=Str+Tmp; end; end; i:=1; while i>0 do i:=send(Ns,Str[1],Length(Str),0); //Отсылаю ответ от сервера клиенту end; closesocket(Ns); end;
constructor TPROXI.Create(Port_: WORD); Var ThId: DWORD; Ns: TSocket; Th: Pointer; begin Colors(True); WSAStartup($101, ws); Sock := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
GetMem(Host,MAX_PATH); GetMem(Data,MAX_PATH); ZeroMemory(Data,MAX_PATH);
Port:= Port_;
hAddr.sin_family:=PF_INET; hAddr.sin_port:=htons(PORT); hAddr.sin_addr.S_addr:=INADDR_ANY;
Bind(Sock, hAddr, SizeOf(hAddr)); Listen(Sock,1); repeat Ns := accept(Sock, nil, nil); CloseHandle(CreateThread(nil,0,@THREAD,Pointer(Ns),0,ThId)); until False; end;
destructor TPROXI.destroy; Var c: Word; begin FreeMem(Host); FreeMem(Data); inherited; end;
procedure TPROXI.Recv_; begin
end;
procedure TPROXI.Send_(Date: Pointer); begin
end;
end.
Program ultimatum;
{$AppType Console}
uses Windows,TProxiUnit;
var S: TPROXI; begin S:= TPROXI.Create(8080); Readln; end.
|
|
| |
Neo | Дата: Среда, 02.10.2013, 13:25 | Сообщение # 2 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Вот,поправил сейчас,но пока есть ещё косяки кое-какие...
|
|
| |
xXxSh@dowxXx | Дата: Пятница, 04.10.2013, 19:12 | Сообщение # 3 |
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
| ОФФТОП:
|
|
| |