Праздники Исландии
Праздники Исландии
Вход

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

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

афоризмы  


Прокси сервер на С# - 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
Возраст : 34
Географическое положение : Исландия
Настроение : Всегда отличное!

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
Гость
Гость


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

Предыдущая тема Следующая тема Вернуться к началу

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

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