Последние темы
Похожие темы
    Праздники Исландии
    Праздники Исландии
    Вход

    Забыли пароль?

    Ключевые слова

    тараканова  виола  афоризмы  


    Прокси сервер на С# - Proxy TCP Server Visual Studio C#

    Перейти вниз

    Прокси сервер на С# - Proxy TCP Server Visual Studio C#

    Сообщение автор Admin в Ср Мар 12, 2008 5:24 am

    Вот он:

    Код:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.IO;

    namespace MyProxyServer
    {
    class MyProxyServer
    {
    Socket clientSocket;
    Byte[] readbyte = new byte[4096];
    Byte[] buffermessage = null;
    Byte[] receivebuffer = new Byte[4096];
    int iCountFiles = 1;
    string sFileName = "myproxyserver_data_";
    string sFileExt = ".dat";
    string sFullFileName = "";
    long count = 0;
    string logFileName = "MyProxyLogFile.txt";

    public MyProxyServer(Socket socket)
    {
    this.clientSocket = socket;
    }

    public void runProxy()
    {
    String sMessage = " ";
    String swebhost = " ";
    string stmpstring = "";
    int iHostNameStart = 0;
    int iHostNameEnd = 0;
    int iHostNameEndFirstSlash = 0;
    string sRequest2LogFile = "";
    string sRequest2LogFileOld = "";
    string sDataFileToSend = "";
    long total = 0;

    //Client socket, the client is using this program as a proxy server
    int ireadbytes = clientSocket.Receive(readbyte, 4096, 0);
    stmpstring = Encoding.ASCII.GetString(readbyte);
    sMessage = (String)stmpstring;

    //Get the request from the message
    sRequest2LogFile = sMessage.Substring(0, sMessage.IndexOf("HTTP", 10) - 1);
    //Check if we have already this request on the disk
    sDataFileToSend = WebRequestExists(sRequest2LogFile);
    if (sDataFileToSend != "")
    {
    //We have a file to send instead of get the webpage
    FileStream fileDataFromDisk = new FileStream(sDataFileToSend, FileMode.Open);
    buffermessage = new Byte[fileDataFromDisk.Length];

    int ireadbytesfromfile = fileDataFromDisk.Read(buffermessage, 0, buffermessage.Length);
    while (ireadbytesfromfile != 0)
    {
    clientSocket.Send(buffermessage, ireadbytesfromfile, 0);
    ireadbytesfromfile = fileDataFromDisk.Read(buffermessage, 0, buffermessage.Length);
    }
    clientSocket.Close();
    }
    else
    {
    while (ireadbytes != 0)
    {
    FileStream logFileStream = new FileStream(logFileName, FileMode.Append);
    total = 0;
    //Parse the string to find the host and web page
    iHostNameStart = sMessage.IndexOf("http://");
    iHostNameEnd = sMessage.IndexOf(" ", 7 + iHostNameStart);
    iHostNameEndFirstSlash = sMessage.IndexOf("//");
    iHostNameEndFirstSlash = sMessage.IndexOf("/", iHostNameEndFirstSlash + 3);

    if (sMessage.Substring(0, 7) != "CONNECT")
    {
    swebhost = sMessage.Substring(iHostNameStart + 7, iHostNameEndFirstSlash - 11);

    Console.WriteLine("Connecting to the page {0}",
    sMessage.Substring(iHostNameStart, iHostNameEnd - iHostNameStart));
    Console.WriteLine("Connection from {0} the client", clientSocket.RemoteEndPoint);
    IPHostEntry IPHost = Dns.GetHostEntry(swebhost);
    IPAddress[] ipAddressList = IPHost.AddressList;
    IPEndPoint ipEndPoint = new IPEndPoint(ipAddressList[0], 80);
    //This is a socket to the real webserver with the webpage
    Socket websocket = new Socket
    (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    websocket.Connect(ipEndPoint);

    if (websocket.Connected)
    {
    Console.WriteLine("Socket connected OK to webserver");
    }
    //sMessage is the request from the client
    string hostmessage = sMessage;
    Byte[] getmessage = Encoding.ASCII.GetBytes(hostmessage);
    //Send the message package to the webserver
    websocket.Send(getmessage, getmessage.Length, 0);
    //Receive data from the webserver
    Int32 ireceivedbyte = websocket.Receive(receivebuffer, receivebuffer.Length, 0);
    Console.WriteLine("Received from webserver socket {0} bytes", +ireceivedbyte);
    String spage = null;
    spage = spage + Encoding.ASCII.GetString(receivebuffer, 0, ireceivedbyte);

    while (ireceivedbyte > 0)
    {
    ireceivedbyte = websocket.Receive(receivebuffer, receivebuffer.Length, 0);
    spage = spage + Encoding.ASCII.GetString(receivebuffer, 0, ireceivedbyte);
    Console.WriteLine("Received from webserver socket {0} bytes", +ireceivedbyte);
    }

    if (sRequest2LogFile != sRequest2LogFileOld)
    {
    sRequest2LogFile = "";
    sFullFileName = sFileName + iCountFiles.ToString() + sFileExt;
    while (File.Exists(sFullFileName))
    {
    iCountFiles++;
    sFullFileName = sFileName + iCountFiles.ToString() + sFileExt;
    }
    //new FILE
    FileStream file1 = new FileStream(sFullFileName, FileMode.Create);
    sRequest2LogFile = sMessage.Substring(0, sMessage.IndexOf("HTTP", 10) - 1);
    string sTmpStr = "REQUEST:" + sRequest2LogFile + "," + "FILE:" + file1.Name + "\r\n";
    byte[] byte2logfile = new byte[sTmpStr.Length];
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    byte2logfile = encoding.GetBytes(sTmpStr);
    logFileStream.Write(byte2logfile, 0, byte2logfile.Length);
    logFileStream.Close();
    sRequest2LogFileOld = sRequest2LogFile;

    //Read into memory stream
    MemoryStream memStream = new MemoryStream(receivebuffer);
    memStream.WriteTo(file1);
    http://file1.Write(receivebuffer, 0, receivebuffer.Length);
    count = memStream.Length;

    total += count;
    Console.WriteLine(" wrote {0} total bytes", total);
    }

    //Now we send the message back to the orginal client who was asking for some webpage
    buffermessage = new Byte[spage.Length + 1];
    int ilength = Encoding.ASCII.GetBytes(spage, 0, spage.Length, buffermessage, 0);
    clientSocket.Send(buffermessage, ilength, 0);
    websocket.Shutdown(SocketShutdown.Both);
    websocket.Close();
    ireadbytes = clientSocket.Receive(readbyte, 4096, 0);
    http://file1.Close();

    }
    }
    }
    }

    public string WebRequestExists(string sRequest)
    {
    string sDataFileName = "";
    string sLine = "";
    string sLocalRequest = "";
    int iStartOffFileName = 0;
    int ilen;

    if (File.Exists(logFileName))
    {
    FileStream logFileCheck = new FileStream(logFileName, FileMode.Open);

    StreamReader inStream = new StreamReader(logFileCheck);
    sLine = inStream.ReadLine();
    while (sLine != null)
    {
    Console.WriteLine(sLine);
    iStartOffFileName = sLine.IndexOf("FILE:", 15);

    sLocalRequest = sLine.Substring(8, iStartOffFileName - 9);

    //We already have the reqeust
    if (sLocalRequest == sRequest)
    {
    ilen = sLine.Length;

    sDataFileName = sLine.Substring
    (iStartOffFileName + 5, sLine.Length - iStartOffFileName - 5);
    }
    sLine = inStream.ReadLine();
    }

    logFileCheck.Close();
    }
    return sDataFileName;
    }

    public static int Main(string[] args)
    {
    const int proxyport = 5678;
    TcpListener tcplistener = new TcpListener(IPAddress.Any, proxyport);
    Console.WriteLine("Proxy server is listening to port {0}", +proxyport);
    tcplistener.Start();
    while (true)
    {
    Socket socket = tcplistener.AcceptSocket();
    MyProxyServer myproxyserver = new MyProxyServer(socket);
    Thread thread = new Thread(new ThreadStart(myproxyserver.runProxy));
    thread.Start();
    return 0;
    }
    }
    }
    }

    Возможно он облегчит кому-нибудь жизнь :)

    _________________
    ООО "АйсКорпо Рус" www.icecorpo.is



    Школа русского языка в Исландии www.modurmal.com
    avatar
    Admin
    Admin
    Admin

    Женщина Количество сообщений : 2957
    Дата рождения : 1983-07-18
    Возраст : 35
    Географическое положение : Исландия
    Настроение : Всегда отличное!

    http://www.icecorpo.is

    Вернуться к началу Перейти вниз

    Что вы знаете о proxy?

    Сообщение автор Гость в Пт Мар 28, 2008 4:29 am

    А вот и немного теории:

    В интернете часто можно встретить заявления, что прокси-сервер служит для ускорения загрузки за счет кэширования содержимого страниц, DNS и т.п. На самом деле это только одно из полезных свойств прокси-серверов, но не главное и присущее далеко не всем серверам.

    Из многочисленных значений английского слова "proxy" в данном контексте применимы следующие: «доверенное лицо», «полномочный представитель». То есть некто, действующий от вашего имени и по вашему поручению. В компьютерной терминологии «прокси» — это программа, которая передает запросы вашего ПО в Интернет, получает ответы и передает их обратно. Необходимость в такой программе обычно возникает, если с пользовательского места нельзя работать в Интернете напрямую, но выход есть на другом компьютере в его локальной сети. Тогда на этом другом компьютере ставят прокси, а софт на всех остальных компьютерах сети настраивают таким образом, чтобы работа велась через него. Сейчас через прокси умеют работать практически все более-менее популярные программы, так или иначе предназначенные для работы с сетью. Таким образом, если хоть один компьютер в локальной сети имеет доступ «вовне», то и все остальные могут пользоваться этим соединением.

    Возможна ли такая работа без прокси? Да, возможна — когда-то все так делали. Но такая работа требует выполнения определенных дополнительных условий и имеет свои минусы в сравнении с использованием прокси.

    Условия следующие: каждому компьютеру должен быть выдан персональный «внешний» IP-адрес и построена схема маршрутизации. Это (получение IP) невозможно сделать без участия провайдера. Провайдеры идут на это, но, как правило, за отдельную плату — например, $5 за каждый IP в месяц. А если у вас сеть хотя бы в 50 машин? Это хлопотно, дорого и снижает уровень безопасности вцелом: каждый компьютер вашей сети станет потенциальной мишенью хакеров, вирусных атак и прочих «прелестей» Интернета. При правильной настройке соответствующего ПО это не очень страшно, но рядовые пользователи не склонны следить за безопасностью своих компьютеров, значит, будут дополнительные хлопоты у администраторов сети. И возможностей контролировать работу пользователей у администратора будет меньше, так как система децентрализована. Кстати, при таком способе подключения тоже нужна программа-посредник на том компьютере, который непосредственно подключен к интернету. Но при наличии реальных IP-адресов эта программа — обычный роутер (маршрутизатор) IP-пакетов. Она является либо частью операционной системы, либо, вообще, «встроена» в соответствующее оборудование. И к этой программе название «прокси» не применяют. Важное отличие маршрутизатора от прокси — при использовании маршрутизатора IP-пакеты остаются без изменений — в них сохраняются исходные адреса компьютеров локальной сети. А прокси всегда работает от своего «имени» и адреса клиентов не передаются, т.е. недоступны из Интернета. Маршрутизатор, меняющий адреса, уже является прокси (его называют NAT-proxy, NAT = network address translation).

    Ну и так далее... Arrow
    avatar
    Гость
    Гость


    Вернуться к началу Перейти вниз

    Вернуться к началу

    - Похожие темы

     
    Права доступа к этому форуму:
    Вы не можете отвечать на сообщения