8 / 8 / 2
Регистрация: 27.10.2013
Сообщений: 206
1

Прокси-сервер работает нестабильно

14.12.2013, 18:24. Показов 2555. Ответов 2
Метки нет (Все метки)

Здравствуйте.
Требуется написать HTTP прокси-сервер c#.
Разобрал код здесь: http://kbyte.ru/ru/Programming... 6&mode=art
Вроде все понятно.

Но работает это очень неустойчиво: сайты могут открываться и не открываться, отваливается подключение и т.д.
Привожу самую простую реализацию. Помогите разобраться, в чем дело?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
 
namespace PoxyEasy
{
  class Program
  {
    static void Main(string[] args)
    {
      // слушаем локальный апишник (127.0.0.1) и порт 8888
      TcpListener myTCP = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
      // поехали!
      myTCP.Start();
 
      while (true)
      {
        // смотрим, есть запрос или нет
        if (myTCP.Pending())
        {
          // запрос есть
          using (Socket myClient = myTCP.AcceptSocket())
          {
            // соединяемся
            if (myClient.Connected)
            {
              // получаем тело запроса
             // byte[] httpRequest = ReadToEnd(myClient); - было много ошибок, исправил на блок с try
                byte[] httpRequest;
                try
                {
                    byte[] b = new byte[myClient.ReceiveBufferSize];
                    int len = 0;
                    using (MemoryStream m1 = new MemoryStream())
                    {
                        while (myClient.Poll(1000000, SelectMode.SelectRead) && (len = myClient.Receive(b, myClient.ReceiveBufferSize, SocketFlags.None)) > 0)
                        {
                            m1.Write(b, 0, len);
                        }
                        httpRequest = m1.ToArray();
                    }
 
 
 
                    // ищем хост и порт
                    Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
                    Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest));
                    string host = m.Groups["host"].Value;
                    int port = 0;
                    // если порта нет, то используем 80 по умолчанию
                    if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; }
 
                    // получаем апишник по хосту
                    IPHostEntry myIPHostEntry = Dns.GetHostEntry(host);
 
                    // создаем точку доступа
                    IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], port);
 
                    // создаем сокет и передаем ему запрос
                    using (Socket myRerouting = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                    {
                        myRerouting.Connect(myIPEndPoint);
                        if (myRerouting.Send(httpRequest, httpRequest.Length, SocketFlags.None) != httpRequest.Length)
                        {
                            Console.WriteLine("При отправке данных удаленному серверу произошла ошибка...");
                        }
                        else
                        {
                            // получаем ответ
                        //    byte[] httpResponse = ReadToEnd(myRerouting); - было много ошибок, исправил на блок с try
                     byte[] httpResponse ;
                            try{
                                  byte[] b1 = new byte[myRerouting.ReceiveBufferSize];
      int len1 = 0;
      using (MemoryStream m2 = new MemoryStream())
      {
          while (myRerouting.Poll(1000000, SelectMode.SelectRead) && (len1 = myRerouting.Receive(b, myRerouting.ReceiveBufferSize, SocketFlags.None)) > 0)
          {
              m2.Write(b, 0, len1);
          }
          httpResponse = m2.ToArray();
      }
                            
                            // передаем ответ обратно клиенту
                            if (httpResponse != null && httpResponse.Length > 0)
                            {
                                myClient.Send(httpResponse, httpResponse.Length, SocketFlags.None);
                            }
                        }
                            catch{}
                    }
               
                }
                
            } 
                catch { }
          }
          }
        
      }
      }
 
      myTCP.Stop();
    }
 
    private static byte[] ReadToEnd(Socket mySocket)
    {
      byte[] b = new byte[mySocket.ReceiveBufferSize];
      int len = 0;
      using (MemoryStream m = new MemoryStream())
      {
        while (mySocket.Poll(1000000, SelectMode.SelectRead) && (len = mySocket.Receive(b, mySocket.ReceiveBufferSize, SocketFlags.None)) > 0)
        {
          m.Write(b, 0, len);
        }
        return m.ToArray();
      }
    }
 
  }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2013, 18:24
Ответы с готовыми решениями:

Не работает прокси сервер
Доброго времени суток, уважаемые гости этой страницы! Есть код, который принимает HTTP запрос от...

При передаче post запроса через прокси сервер в ответ приходят ошибки с прокси сервера
При передаче post запроса через прокси сервер в ответ прилетают ошибки с прокси сервера:...

Прокси сервер. Порт занят
При запуске прокси сервера TcpListener на 80 порту, выходит ошибка Обычно разрешается только одно...

Кэширующий HTTP прокси-сервер
Здравствуйте! Нужно проконсультироваться. Необходимо написать кэширующий HTTP прокси-сервер....

2
1270 / 971 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
14.12.2013, 19:52 2
если нужен результат, а не процесс -качай http://fiddler2.com/fiddlercore
пара-тройка строк на шарпе, ддлку в папку и будет полноценный, мощный и быстрый прокси
0
8 / 8 / 2
Регистрация: 27.10.2013
Сообщений: 206
14.12.2013, 20:59  [ТС] 3
Конечно, я бы так и сделал, но это задание и важен именно процесс.

Кстати, проблему решил, сняв галочку "Автоматические настройки" в браузере
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2013, 20:59
Помогаю со студенческими работами здесь

Перенаправить пакеты на прокси сервер программно
Всем привет. Известно, что некоторая программа отправляет пакеты на адрес 111.111.111.111....

HTTP прокси сервер с поддержкой SSL
Вот интересно - как собственно организовать прокси сервер с поддержкой SSL? C обычным все понятно -...

Как отправить e-mail через прокси-сервер?
Как отправить e-mail через прокси-сервер? Спасибо.

Прокси-сервер: как вывести некоторые операции в отдельный поток
Собственно у меня прокси сервер получает пакет и обрабатывает, но пока он обрабатывает - другие не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru