|
ru.nethack- RU.NETHACK ------------------------------------------------------------------- From : Anton Fedorov 2:5000/111.33 04 Nov 2002 19:53:58 To : Andrew Nikolaev Subject : Re: Http тунель -------------------------------------------------------------------------------- Воскресенье Hоябрь 03 2002 14:51, Andrew Nikolaev НН. Anton Fedorov: SR>>> Подскажите кто нибудь как оpганизовать сабж. AF>> если есть CONNECT метод, то подняв y себя слyшалкy на нyжном AF>> поpтy, по коннектy на нее посылать CONNECT хост:поpт AF>> HTTP/1.1\n\n, дождаться CONNECTED и поднять соединение. AF>> я так делаю. AN> а можно еще подробнее? - совсем для ламеров? можно. действия: list = createsocket bint ( list, listport ) while (1) { listen(list) client = accept(list) server = createsocket connect(server, address(serveraddr, serverport)) createthread(serverthread, {server, client}) createthread(clientthread, {client, server}) } где serverthread (server, client){ send(server,'CONNECT tunnelhost:tunnelport HTTP/1.1') recv(server,'HTTP/1.'[0;1]' 200') while (1) { recv(server, buf) if error { close(server) close(client) exit } send(client, buf) if error { close(server) close(client) exit } } } а clientthread (client, server){ while (1) { recv(client, buf) if error { close(client) close(server) exit } send(server, buf) if error { close(client) close(server) exit } } } AN> и с примером бpp. тyннель каким я пользyюсь на pаботе, но накидал вот :) за качество кода не пинать - десятиминyтки в пpинципе не вылизываю. подсветочкy pекоммендyется в голдеде отpyбить. ps: писалось под vp 2.1 ЪДДДДДДДДДДДДДДДДДДДДДДД. ГРЫЗИ tunnel.pas .ДДДДДДДДДДДДДДДДДДДДДДДї uses windows, winsock, sysutils; const LISTEN_PORT=3128; // Port for listen on const CONNECT_TO='localhost'; // Proxy address const CONNECT_PORT=80; // Proxy port const TUNNEL_TO='localhost'; // Address for tunnel to const TUNNEL_PORT='21'; // Port for tunnel to var ClSock: TSOCKET; SrSock: TSOCKET; Event: Handle; function ServerProc(a: pointer): longint; stdcall; var Clnt, Serv: TSocket; Buffer: array[-3..1023] of char; retval: longint; B: longint; i: integer; procedure CloseConnect; begin WSAGetLastError; CloseSocket(Serv); WSAGetLastError; CloseSocket(Clnt); WSAGetLastError; ExitThread(0); end; begin Clnt:=ClSock; PWord(@Buffer)^:=0; Serv:=SrSock; B:=-1; PulseEvent(Event); lstrcpy(@Buffer[0], 'CONNECT '+TUNNEL_TO+':'+TUNNEL_PORT+ ' HTTP/1.1'#13#10#13#10); retval := send(serv,Buffer[0],lstrlen(@Buffer[0]),0); if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect; while true do begin retval := recv(serv,Buffer[0],sizeof (Buffer),0 ); if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect; if b<0 then if (PLongint(@Buffer[0])^=$50545448{HTTP}) and (PLongint(@Buffer[8])^=$30303220{ 200}) then b:=2 else begin send(clnt, Buffer[0], retval, 0); CloseConnect; end; if b>0 then begin for i:=0 to retval do if ((Buffer[i-3]=#$0D) and (Buffer[i-2]=#$0A) and (Buffer[i-1]=#$0D) and (Buffer[i ]=#$0A)) or ((Buffer[i-3]=#$0A) and (Buffer[i-2]=#$0D) and (Buffer[i-1]=#$0A) and (Buffer[i ]=#$0D)) or ((Buffer[i-1]=#$0D) and (Buffer[i ]=#$0D)) or ((Buffer[i-1]=#$0A) and (Buffer[i ]=#$0A)) then begin dec(retval, i+1); move(Buffer[i+1], Buffer[0], retval); b:=0; break end; if b>0 then move(Buffer[retval-3], Buffer[0], 3); end; if (b=0) and (retval>0) then begin retval := send(clnt,Buffer[0],retval,0); if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect; end; end; end; function ClientProc(a: pointer): longint; stdcall; var Clnt, Serv: TSocket; Buffer: array[0..1023] of char; retval: longint; procedure CloseConnect; begin WSAGetLastError; CloseSocket(Clnt);WSAGetLastError; CloseSocket(Serv);WSAGetLastError; ExitThread(0); end; begin Clnt:=ClSock; Serv:=SrSock; PulseEvent(Event); while true do begin retval := recv(clnt,Buffer,sizeof(Buffer),0 ); if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect; retval := send(serv,Buffer,retval,0); if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect; end; end; var th: longint; retval: longint; fromlen: longint; i: longint; local, from, connect_addr: tsockaddrin; wsa: TWSADATA; listen_socket: TSOCKET; t: text; h: phostent; begin try RegisterServiceProcess(0,1); if (WSAStartup($202,wsa) = SOCKET_ERROR) then exit; Event:=CreateEvent(nil, false, false, nil); connect_addr.sin_family := AF_INET; connect_addr.sin_addr.s_addr := inet_addr(CONNECT_TO); if connect_addr.sin_addr.s_addr=INADDR_NONE then begin h:=gethostbyname(CONNECT_TO); connect_addr.sin_addr.s_addr:=plongint(h^.h_addr_list^)^; end; connect_addr.sin_port := htons(CONNECT_PORT); fillchar(local, sizeof(local), 0); local.sin_family := AF_INET; local.sin_addr.s_addr := INADDR_ANY; local.sin_port := htons(LISTEN_PORT); listen_socket := socket(AF_INET, SOCK_STREAM,0); // TCP socket if (listen_socket = INVALID_SOCKET) then exit; if (bind(listen_socket,local,sizeof(local))= SOCKET_ERROR) then exit; assign(T, 'leftmans.log'); while true do begin fromlen:=sizeof(from); if (listen(listen_socket,5) = SOCKET_ERROR) then exit; ClSock := accept(listen_socket, from, fromlen); if (ClSock = INVALID_SOCKET) then exit; with from.sin_addr.S_un_b do if not (((s_b1=#192) and (s_b2=#168) and (s_b3=#242) and (s_b4 in [#31,#32]) ) or ((s_b1=#127) and (s_b2=#0) and (s_b3=#0) and (s_b4=#1) ) ) then begin append(t); if IOResult<>0 then rewrite(t); writeln(t, FormatDateTime('c', Now), ' ', ord(s_b1), '.', ord(s_b2), '.', ord(s_b3), '.', ord(s_b4), 'Unauthorised access to tunnel on port ', LISTEN_PORT); close(t); inoutres:=0; CloseSocket(ClSock); WSAGetLastError; continue; end; SrSock := socket(AF_INET, SOCK_STREAM, 0); if (listen_socket = INVALID_SOCKET) then begin CloseSocket(ClSock); WSAGetLastError; continue; end; if (connect(SrSock, connect_addr, sizeof(connect_addr))=SOCKET_ERROR) then begin CloseSocket(ClSock); WSAGetLastError; CloseSocket(SrSock); WSAGetLastError; continue; end; CreateThread(nil, 16*1024, @ClientProc, nil, 0, Th); WaitForSingleObject(Event, -1); CreateThread(nil, 16*1024, @ServerProc, nil, 0, Th); WaitForSingleObject(Event, -1); end; finally WSACleanup; ExitProcess(-1); end; end. АДДДДДДДДДДДДДДДДДДДДДДД. ХВАТИТ tunnel.pas .ДДДДДДДДДДДДДДДДДДДДДДДЩ >>[Im new]`\./'Ъ [ Играл в сапёра. Много думал ] [ Suicide ] [ Asm ] ... TAGLN:(@c@)Г datacompboy@mail.ru ЕICQ:27235262Е [Team /Фepдoпepдoзники/] --- TEARL:<(#)>А Помни, Andrew, что жить бессмысленно. Ho и помиpать тоже! * Origin: L`L Путь к сердцу фидошника лежит через его нетмэйл (2:5000/111.33) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.nethack/38313dc6c443.html, оценка из 5, голосов 10
|