 |
08.04.2014, 12:56
|
#16
|
|
|
|
Пехотинец
|
 Регистрация: 28.12.2009
 Сообщений: 75
 Популярность: 427
 Сказал(а) спасибо: 19
Поблагодарили 38 раз(а) в 23 сообщениях
|
Re: Socks4 прокси сервер C#
Хочу вставить и свои 5 копеек
Простенький Http Proxy сервер, наработка конечно не моя... но довольно полезная
Классы
Код:
public class HttpProcessor
{
public TcpClient socket;
public HttpServer srv;
private Stream inputStream;
public StreamWriter outputStream;
public String http_method;
public String http_url;
public String http_protocol_versionstring;
public Hashtable httpHeaders = new Hashtable();
private static int MAX_POST_SIZE = 10 * 1024 * 1024; // 10MB
public HttpProcessor(TcpClient s, HttpServer srv)
{
this.socket = s;
this.srv = srv;
}
private string streamReadLine(Stream inputStream)
{
int next_char;
string data = "";
while (true) {
next_char = inputStream.ReadByte();
if (next_char == '\n') { break; }
if (next_char == '\r') { continue; }
if (next_char == -1) { Thread.Sleep(1); continue; };
data += Convert.ToChar(next_char);
}
return data;
}
public void process()
{
inputStream = new BufferedStream(socket.GetStream());
outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
try {
parseRequest();
readHeaders();
if (http_method.Equals("GET")) {
handleGETRequest();
} else if (http_method.Equals("POST")) {
handlePOSTRequest();
}
} catch (Exception e)
{
writeFailure();
}
outputStream.Flush();
inputStream = null; outputStream = null;
socket.Close();
}
public void parseRequest()
{
String request = streamReadLine(inputStream);
string[] tokens = request.Split(' ');
if (tokens.Length != 3) {
throw new Exception("invalid http request line");
}
http_method = tokens[0].ToUpper();
http_url = tokens[1];
http_protocol_versionstring = tokens[2];
}
public void readHeaders()
{
String line;
while ((line = streamReadLine(inputStream)) != null) {
if (line.Equals("")) {;
return;
}
int separator = line.IndexOf(':');
if (separator == -1)
{
throw new Exception("invalid http header line: " + line);
}
String name = line.Substring(0, separator);
int pos = separator + 1;
while ((pos < line.Length) && (line[pos] == ' '))
{
pos++;
}
string value = line.Substring(pos, line.Length - pos);
httpHeaders[name] = value;
}
}
public void handleGETRequest() {
srv.handleGETRequest(this);
}
private const int BUF_SIZE = 4096;
public void handlePOSTRequest()
{
int content_len = 0;
MemoryStream ms = new MemoryStream();
if (this.httpHeaders.ContainsKey("Content-Length")) {
content_len = Convert.ToInt32(this.httpHeaders["Content-Length"]);
if (content_len > MAX_POST_SIZE) {
throw new Exception(
String.Format("POST Content-Length({0}) too big for this simple server",
content_len));
}
byte[] buf = new byte[BUF_SIZE];
int to_read = content_len;
while (to_read > 0)
{
int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read));
if (numread == 0) {
if (to_read == 0) {
break;
} else {
throw new Exception("client disconnected during post");
}
}
to_read -= numread;
ms.Write(buf, 0, numread);
}
ms.Seek(0, SeekOrigin.Begin);
}
srv.handlePOSTRequest(this, new StreamReader(ms));
}
public void writeSuccess(string content_type="text/html") {
outputStream.WriteLine("HTTP/1.0 200 OK");
outputStream.WriteLine("Content-Type: " + content_type);
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
}
public void writeFailure() {
outputStream.WriteLine("HTTP/1.0 404 File not found");
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
}
}
public abstract class HttpServer
{
protected int port;
TcpListener listener;
bool is_active = true;
public HttpServer(int port)
{
this.port = port;
}
public void listen()
{
listener = new TcpListener(port);
listener.Start();
while (is_active)
{
TcpClient s = listener.AcceptTcpClient();
HttpProcessor processor = new HttpProcessor(s, this);
Thread thread = new Thread(new ThreadStart(processor.process));
thread.Start();
Thread.Sleep(1);
}
}
public abstract void handleGETRequest(HttpProcessor p);
public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData);
}
public class MyHttpServer : HttpServer
{
public MyHttpServer(int port)
: base(port) {}
public override void handleGETRequest (HttpProcessor p)
{
Console.WriteLine("GET:" + p.http_url);
//p.outputStream.WriteLine(new WebClient().DownloadString("<<Host Adress>>"+p.http_url));
}
public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData)
{
Console.WriteLine("POST:" + p.http_url);
}
}
Иницилизация
Код:
HttpServer httpServer;
httpServer = new MyHttpServer(80);
Thread thread = new Thread(new ThreadStart(httpServer.listen));
thread.Start();
Как пользоватся
Http сервер поднимается на 80 порту, если есть скайп и он не правильно сконфигурирован, то он может сам сидеть на 80 порту
В методе MyHttpServer.handleGETRequest пишем код обработки Get запросов, можно делать что угодно, ответ сервера нужно записать в outputStream, в примере просто вывод запроса в консоль, и пример ответа(закомметирован, отвечает всегда пустотой)
MyHttpServer.handlePOSTRequest - аналогично
Практическое приминение ? я использовал как зеркало, добалял в hosts адрес целевого хоста с переадресацией на себя, предварительно зарезольвив у DNS адрес хоста, а итоге приложение вело общение с удалённым Http сервером, и я мог корректировать нужные ответы и запросы
При поднятии на другом порту работает как HttpProxy сервер
Последний раз редактировалось megweg; 08.04.2014 в 13:10.
|
|
|
11.09.2014, 01:04
|
#17
|
|
|
|
Разведчик
|
 Регистрация: 26.08.2014
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
А такой вопрос, каким образом отправлять пакет в прокси с этого поста http://zhyk.ru/forum/showthread.php?...08#post4289146
Последний раз редактировалось SiriusED; 12.09.2014 в 13:10.
|
|
|
12.09.2014, 13:10
|
#18
|
|
|
|
Разведчик
|
 Регистрация: 26.08.2014
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
Как я понял то тут не один соккет а для каждого соединения свой соккет... Во общем пришлось ппц много переписать но реализовал через хранение всех подключений в листе, и потом через поиск порта в листе Out сокетов нахожу нужный мне сокет и через него посылаю пакет.
В принципе сервер работает стабильно, но иногда лишь только бывают баги когда пакеты "зависают" в обработчике и все висит..
|
|
|
16.09.2014, 21:59
|
#19
|
|
|
|
Разведчик
|
 Регистрация: 26.08.2014
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
Нашел другой сервер переписал его под себя и оказалось что сервер из поста http://zhyk.ru/forum/showthread.php?...08#post4289146 пропускал ~70% пакетов...
Жаль потраченного времени на него только, сервер не серьезный...
|
|
|
17.09.2014, 16:55
|
#20
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: Socks4 прокси сервер C#
1. Сервер из 150 строк, треть из которых это скобки, не может быть серьезным
2. В TCP Нет пакетов, а проксирование UDP я не реализовывал.
3. Исходя из 2, сервер не может пропускать пакеты, максимум это потеря связи с сервером или вообще неудачное соединение. Сервер не буфферизирует поток, он передает ровно столько сколько смог прочитать, по этой причине повторюсь, пропуски невозможны.
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
17.09.2014, 19:09
|
#21
|
|
|
|
Разведчик
|
 Регистрация: 26.08.2014
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
Не ну я не жалуюсь на сервер, сервер для простых целей вполне даже норм.
Ну а на счет потерь пакетов то я даже хз, тестил через простое обновление страницы в гугле, все пакеты TCP, он ловит 24пакета, а мой ловит 280пакетов... Ну это точно не потери, тут что-то дрегое... Или мой ловит какой-то мусор я хз...
|
|
|
20.09.2014, 16:49
|
#22
|
|
|
|
Разведчик
|
 Регистрация: 26.08.2014
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
Короче разобрался почему он так много ловил, стоял буфер на 128байт, а у вашего на 2048. Так что все нормально с этом, извиняйте..
|
|
|
07.08.2015, 15:11
|
#23
|
|
|
|
Разведчик
|
 Регистрация: 26.11.2014
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
А нет какой-нибудь инструкции, как этим пользоваться? Тем, что в старте темы. А то сайт не работает..
|
|
|
21.02.2016, 23:48
|
#24
|
|
|
|
Разведчик
|
 Регистрация: 21.02.2016
 Сообщений: 2
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Socks4 прокси сервер C#
спасибо)
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 16:17.
|
 |