Ошибка в работе прокси-сервера - 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);