Ошибка в работе прокси-сервера - C#
Формулировка задачи:
Добрый вечер!
Вот код программы:
Вот ошибка:
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 Proxy { class Program { //Функция будет принимать экземпляр сокета и возвращать полученный ответ в виде массива байт 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(); } } static void Main(string[] args) { //Инициализируем класс TcpListener для прослушивания порта 8888 TcpListener myTCP = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080); //Старт прослушивания myTCP.Start(); //Бесконеный цикл для постоянной работы программы while (true) { //Проверка на наличие запросов к прокси - серверу if (myTCP.Pending()) { //Если запрос есть, то создаем сокет для обработки данных using (Socket myClient = myTCP.AcceptSocket()) { //Открываем сокет для чтения запроса if (myClient.Connected) { //Получение запроса клиента byte[] httpRequest = ReadToEnd(myClient); //Перенаправление запроса на 80 порт 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; if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; } //Получение IP-адрес по хосту 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); //И напрявляем клиенту myClient.Send(httpResponse, httpResponse.Length, SocketFlags.None); } } } } } } } } }
Решение задачи: «Ошибка в работе прокси-сервера»
textual
Листинг программы
IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[4], port);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д