Прокси на делфи

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Wave, 7 Jan 2011.

  1. Wave

    Wave Member

    Joined:
    15 Aug 2010
    Messages:
    89
    Likes Received:
    11
    Reputations:
    0
    Программа на делфи. Как написать переадресовку пакетов на другой домен? Например чтобы выходить в интернет на какой-то сайт через 127.0.0.1 :confused:

    Что-то вроде прокси... кто-то может помочь?
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Открываешь порт у себя на компе и начинаешь прослушивать его. Дальше, все данные, которые пришли от подключившегося клиента, отправляешь на требуемый сервер, и наоборот.
     
  3. Wave

    Wave Member

    Joined:
    15 Aug 2010
    Messages:
    89
    Likes Received:
    11
    Reputations:
    0
    Так и делал.. В ответ приходит ошибка 404 (
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Возможно, что то неправильно делаешь тогда. Выложи свой код, посмотрим, в чем может быть проблема.
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Пишешь сервер на любом порту и в настройках обозревателя ставишь его как HTTP proxy
    вот простой пример написал на Си
    Code:
    #include <stdio.h>
    #include <winsock2.h> // Wincosk2.h должен быть раньше windows!
    #pragma comment(lib, "ws2_32.lib")
    
    SOCKET tcp_server(USHORT port,int max_client)
    {
    	SOCKET sock=INVALID_SOCKET;
    	struct sockaddr_in addr;
    
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    	if(sock!=INVALID_SOCKET)
    	{
    		addr.sin_family = AF_INET;
    		addr.sin_port = htons(port); // не забываем о сетевом порядке!!!
    		addr.sin_addr.s_addr = 0; // сервер принимает подключения на все свои IP адреса
    
    		if (!(bind(sock, (struct sockaddr *)&addr, sizeof(addr))))
    		{
    			if (listen(sock, max_client))
    			{
    				closesocket(sock);
    				sock=INVALID_SOCKET;
    			}
    		}
    		else{
    			closesocket(sock);
    			sock=INVALID_SOCKET;
    		}
    	}
    	return sock;
    }
    
    int main(int argc, char* argv[])
    {
    	char buff[1024];
    	WSAStartup(0x202,(LPWSADATA)buff);
    	SOCKET listen_sock=tcp_server(1235,1);
    	if(listen_sock==INVALID_SOCKET) return 1;
    	SOCKET client_socket; // сокет для клиента
    	struct sockaddr_in client_addr; // адрес клиента (заполняется системой)
    	int client_addr_size = sizeof(client_addr);
    
    	while ((client_socket = accept(listen_sock, (struct sockaddr *)&client_addr, &client_addr_size)))
    	{
    		// самый простой вариант создать поток, либо завести массив клиентов и проверять их через select
    		// но это просто пример поэтому выведем на экран че пришло
    		int len=recv(client_socket,buff,sizeof(buff),MSG_PEEK);
    		len=recv(client_socket,buff,len,0);
    		if(len>0) { printf("%s\n--\n",buff); }
    	}
    	WSACleanup();
    	return 0;
    }
    
    Основные отличия в запросе это полный адрес иногда с портом для подключения
    поэтому тебе придется разобрать заголовок чтобы узнать куда подключиться и удалить лишнее из запроса.
    После того как ты из заголовка узнал что нужно подключится к forum.antichat.ru (Host) и отправить GET запрос сюда /, собственно создаешь новый сокет подключаешься и делаешь запрос (подробно о том как ГРАМОТНО отправлять GET и ГРАМОТНО получать ответ я описывал в своем болге), а все данные которые тебе пришли в ответ отправляешь обратно клиенту.

    Конечно везде есть куча нюансов, например Connection: keep-alive или там https. Сам мучайся ))))
     
    _________________________
    1 person likes this.
  6. Wave

    Wave Member

    Joined:
    15 Aug 2010
    Messages:
    89
    Likes Received:
    11
    Reputations:
    0

    А примера что нужно отправить к / чтобы получить ответ у вас нет ?
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    мдэ... обрабатывай полученное к такому виду
    Code:
    GET / HTTP/1.0
    User-Agent: Opera/9.80 (Windows NT 6.1; U; MRA 5.7 (build 03796); ru) Presto/2.7.62 Version/11.00
    Host: forum.antichat.ru
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    
    
     
    _________________________
  8. Wave

    Wave Member

    Joined:
    15 Aug 2010
    Messages:
    89
    Likes Received:
    11
    Reputations:
    0
    Gar|k, спасибо! очень помогли )