Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват сетевого соединения [HTTP ч/з NDIS,proxy], Для блокирования выбранных адресов 
:(
    Опции темы
Softaz
Дата 7.5.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



Пишу программку наподобие баннероезки. Надо каким-либо образом органищовать перехват соединения.
Это легче всего сделать с помощью прокси-сервера.
Хотя можно и через сетевой драйвер (но надо ли).

Никак не могу добится устойчивой работы прокси.
Пример взят отсюда: http://www.c-sharpcorner.com//internet/web_proxy.asp

Немного переделан (изменил кодировку, в TcpListener определил локальный адрес и т.д.).

В принципе проксюшка работает, но очень медленно. К тому же открывает не каждый сайт и не каждую страницу smile

Есть ли в .NET какие-либо способы перехвата и что не так в проксюшке? Код приведен ниже.

Заранее спасибо.
Код

using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
using System;


namespace WebProxy2
{

    class WebProxy2
    {
        Socket clientSocket;
        Byte[] read = new byte[1024];
        Byte[] Buffer = null;
        Encoding ASCII = Encoding.Default;
        const string HTTP_VERSION = "HTTP/1.0";
        const string CRLF = "\r\n";
        Byte[] RecvBytes = new Byte[4096];

        public WebProxy2(Socket socket)
        {
            this.clientSocket = socket;
        }
        public void run()
           {
                 String clientmessage = " ", sURL = " ";
                 int bytes = readmessage(read, ref clientSocket, ref clientmessage);
                 if(bytes == 0)
                 {
                       return;
                 }
                 int index1 = clientmessage.IndexOf(' ');
                 int index2 = clientmessage.IndexOf(' ', index1 + 1);
                 if((index1 == -1) || (index2 == -1))
                 {
                       throw new IOException();
                 }
                 Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1));
                 Console.WriteLine("Connection from {0}",
                 clientSocket.RemoteEndPoint);
            
                 string part1 = clientmessage.Substring(index1 + 1, index2 - index1);
                 int index3 = part1.IndexOf('/', index1 + 8);
                 int index4 = part1.IndexOf(' ', index1 + 8);
                 int index5 = index4 - index3;
                 sURL = part1.Substring(index1 + 4, (part1.Length - index5) - 8);
            
            try
                 {
                       IPHostEntry IPHost = Dns.GetHostEntry(sURL);
                       Console.WriteLine("Request resolved: ", IPHost.HostName);
                       string [] aliases = IPHost.Aliases;
                       IPAddress[] address = IPHost.AddressList;
                       Console.WriteLine(address[0]);
                       IPEndPoint sEndpoint = new IPEndPoint(address[0], 80);
                       Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
                       IPsocket.Connect(sEndpoint);
                       if(IPsocket.Connected)
                       Console.WriteLine("Socket connect OK");
                       string GET = clientmessage;
                       Byte[] ByteGet = ASCII.GetBytes(GET);
                       IPsocket.Send(ByteGet, ByteGet.Length, 0);
                       Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
                       Console.WriteLine("Recieved {0}", + rBytes);
                       //Buffer = RecvBytes;
                       String strRetPage = null;
                       strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);
                       while (rBytes > 0)
                       {
                             rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
                             strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);
                       }
                
                      IPsocket.Shutdown(SocketShutdown.Both);
                      IPsocket.Close();
                      sendmessage(clientSocket, strRetPage);
                 }
                 catch (Exception exc2)
                 {
                       Console.WriteLine(exc2.ToString());
                 }
            }
        private int readmessage(byte[] ByteArray, ref Socket s, ref String clientmessage)
        {
            int bytes = s.Receive(ByteArray, 1024, 0);
            string messagefromclient = Encoding.Default.GetString(ByteArray);
            clientmessage = (String)messagefromclient;
            return bytes;
        }

        private void sendmessage(Socket s, string message)
        {
            Buffer = new Byte[message.Length + 1];
            int length = ASCII.GetBytes(message, 0, message.Length, Buffer, 0);
            s.Send(Buffer, length, 0);
        }

        static void Main(string[] args)
        {
            const int port = 8889;
            IPAddress local = IPAddress.Parse("127.0.0.1");
            
            TcpListener tcplistener = new TcpListener(local, port);
            Console.WriteLine("Listening on port {0}", +port);
            tcplistener.Start();
            while (true)
            {
                Socket socket = tcplistener.AcceptSocket();
                WebProxy2 webproxy = new WebProxy2(socket);
                Thread thread = new Thread(new ThreadStart(webproxy.run));
                thread.Start();
            }
        }
    }
}
 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
vinegr
Дата 16.5.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.2.2006

Репутация: 1
Всего: 3



исходный пример на редкость дебилен:
- зачем-то ждет, пока в strRetPage накопится вся страница, вместо того, чтобы отдавать кусками по мере получения.
- блокирующий Receive возвращает 0 как число принятых байт, фактически, по таймауту сокета - в данном примере этот таймаут ожидается на каждом запросе.
- совершенно необязательно открывать/закрывать коннектшн для каждого запроса - в реальной жизни через открытое соединение проходит куча запросов к серверу (и, соответственно, ответов). Если делать по-простому, после установления коннекта с требуемым сервером нужно запустить две нити "навстречу друг-другу" - одна перекладывает байты с клиента(браузера) на сервер, другая - с сервера на клиент (если баннерорезка анализирует НТМЛ -  тут то она и должна работать).
- на каждый запрос создавать экземпляр класса-обработчика - уж больно жирно - надо бы сгородить какой-нить пул обработчиков и использовать их экземпляры повторно. В каждый момент времени браузер держит открытыми только два НТТР-соединения (если по стандарту) - т.е. пул обработчиков будет совсем небольшим и совсем просто управляемым.
- режет глаза преобразование из байтов в строки и обратно и вообще стиль написания.

я бы посоветовал поискать более продвинутый пример, этот дорабатывать себе дороже 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.