Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 23.02.2013, 06:17   #51
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Цитата:
Сообщение от Deadly Посмотреть сообщение
работает с линейкой прекрасно хоть и написан криво(писался давно)
Ну не совсем прекрасно, при попытке подключится к гейм серверу он перестает работать, ибо Accept для нового подключения не вызывается.

Вот мой вариант, правда никак руки не доходят пробросить делегаты для редактирования пакетов
Код:
class SocksProxy
    {
        public int Port;
        
        public SocksProxy(int port)
        {
            this.Port = port;
        }

        public void Listen()
        {
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, Port));
            listener.Listen(100);
            listener.BeginAccept(listener_Accept, listener);
        }

        private void listener_Accept(IAsyncResult ar)
        {
            string remoteIP = string.Empty;
            int remotePort = 0;
            byte[] buffer = new byte[2048];
            Socket temp = (Socket)ar.AsyncState;
            temp.BeginAccept(listener_Accept, temp);

            Socket _in = temp.EndAccept(ar);
            Socket _out = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            _in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
            if (buffer[0] == 5 && buffer[1] == 1 && buffer[2] == 0)
            {
                buffer[1] = 0;
                _in.Send(buffer, 0, 2, SocketFlags.None);
                _in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                if (buffer[3] == 1)
                {
                    remoteIP = buffer[4] + "." + buffer[5] + "." + buffer[6] + "." + buffer[7]; 
                    remotePort = buffer[8]*256 + buffer[9];
                    

                    Console.WriteLine("Socket connected to " + remoteIP + ":" + remotePort);
                }
                buffer[1] = 0;
                _in.Send(buffer, 0, 10, SocketFlags.None);
            }
            _out.Connect(new IPEndPoint(IPAddress.Parse(remoteIP), remotePort)); // подключаемся к серверу ла2
            NetworkState state = new NetworkState(_in, _out, buffer);
            _out.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, out_Receive, state);
            _in.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, in_Receive, state);
        }

        private void in_Receive(IAsyncResult ar) //получили пакет от клиента
        {
            NetworkState state = (NetworkState)ar.AsyncState;
            int received = state.In.EndReceive(ar);

            if (received > 0)
            {
                Console.WriteLine("{0} -> {1}", state.In.RemoteEndPoint, state.Out.RemoteEndPoint);
                Console.WriteLine(Utils.HexDump(state.Buffer, received));
                state.Out.Send(state.Buffer, 0, received, SocketFlags.None); // отправили серверу
                state.In.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, in_Receive,
                    new NetworkState(state.In, state.Out, state.Buffer));
            }
            else
            {
                state.In.Shutdown(SocketShutdown.Both);
                Console.WriteLine("{0} отключен", state.In.RemoteEndPoint);
            }
        }

        private void out_Receive(IAsyncResult ar) //получили пакет от сервера
        {
            NetworkState state = (NetworkState)ar.AsyncState;
            int received = state.Out.EndReceive(ar);

            if (received > 0)
            {
                Console.WriteLine("{0} -> {1}", state.Out.RemoteEndPoint, state.In.RemoteEndPoint);
                Console.WriteLine(Utils.HexDump(state.Buffer, received));
                state.In.Send(state.Buffer, 0, received, SocketFlags.None); // отправили проксификатору
                state.Out.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, out_Receive,
                    new NetworkState(state.In, state.Out, state.Buffer));
            }
            else
            {
                state.Out.Shutdown(SocketShutdown.Both);
                Console.WriteLine("{0} отключен", state.Out.RemoteEndPoint);
            }
        }
    }

    class NetworkState
    {
        public byte[] Buffer;
        public Socket In;
        public Socket Out;
        public NetworkState(Socket sin, Socket sout,byte[] buff)
        {
            this.Buffer = buff;
            this.In = sin;
            this.Out = sout;

        }
    }

Последний раз редактировалось Sinn3r, 23.02.2013 в 06:20. Причина: картинка
Sinn3r вне форума   Ответить с цитированием
Старый 23.02.2013, 11:35   #52
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 46
Сказал Спасибо: 0
Имеет 14 спасибок в 9 сообщенях
Deadly пока неопределено
По умолчанию

Ради интереса попробовал тоже на интерлюди у меня все работает
Зы если это серва с защитой( типо дефо) то там и не будет работать точнее дальше выбора чара вы не пройдете и с пх, тк при нажатие на кнопку принять(выбора чара) идет не форматированный трафик, а то что я скинул он берет 2 байта первых щитает размер и дальше считывает тело пакета, впринципе можно добавить на такой трафик проверку (допустим если выходи за граници 1000)это не сложно, либо поменять буфер на 100000 скажем)))






Добавлено через 22 минуты
Исправленный вариант
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace Прокси_сервер_консоль_ns
{
    class Program
    {
        static void Main(string[] args)
        {
            ////////////////////////////////////////////////////////////////////////////////////////////
            Socket outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            byte[] buf = new byte[100000];
            int ibuf;
            string port;
            string ipa = "";
            int iport = 0;
            int temp;
            NetworkStream nsout;
            //////////////////////////////////////////////////////////////////////////////////////
            Socket ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ssockclient.Bind(new IPEndPoint(IPAddress.Any, 5555));
            ssockclient.Listen(100);
            Socket ss = ssockclient.Accept();
            Console.WriteLine("Запущен 1 поток "+ss.RemoteEndPoint);
            NetworkStream nsin = new NetworkStream(ss);

            ibuf = nsin.Read(buf, 0, buf.Length);
            Console.WriteLine("Принят первый пакет: 1 \n");                   
                    if (buf[0] == 5 && buf[1] == 1 && buf[2] == 0)
                    {
                        buf[0] = 5;
                        buf[1] = 0;
                        nsin.Write(buf, 0, 2);
                        Console.WriteLine("Отправлен пакет: 1 \n");
                        ibuf = nsin.Read(buf, 0, buf.Length);                         
                        Console.WriteLine("Принят пакет: 2 \n");                       
                        if (buf[3] == 1)
                        {
                            Console.WriteLine("строка содержит ип адресс \n");
                          ipa = Convert.ToString(buf[4]);
                            for (int v = 5; v < 8; v++)
                            {
                                ipa = ipa + "." + Convert.ToString(buf[v]);
                            }
                            if (buf[8] != 0)
                            {
                              port = Convert.ToString(buf[8] * 256 + buf[9]) ;
                            }
                            else
                            {
                                port = Convert.ToString(buf[9]);
                            }
                            Console.WriteLine(ipa);
                            Console.WriteLine(port);
                            iport = Convert.ToInt32(port);
                        }
                        buf[1] = 0;
                        nsin.Write(buf, 0, 10);
                        Console.WriteLine("Отправлен пакет: 2 \n");                       
                        
                    }
                    ////////////////////////////////////

                    outsoc.Connect(new DnsEndPoint(ipa, iport));
                    
                    nsout = new NetworkStream(outsoc);

                    int t=0;
                    while (true)
                    {
                        while (nsin.DataAvailable)
                        {
                            t++;

                            Console.Write("\n Пакет принят от клиента\n");
                            nsin.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256)-2;
                            Console.WriteLine(temp);
                            nsout.Write(buf, 0, 2);
                            ibuf = nsin.Read(buf, 0, temp);
                          
                            for (int v = 0; v < ibuf; v++)
                                {
                                    Console.Write(buf[v] + " ");
                                }
                                Console.Write("\n");
                                
                            
                                nsout.Write(buf, 0, ibuf);
                        }

                        while (nsout.DataAvailable)
                        {
                            t++;
                            Console.Write("\n Пакет принят от сервера\n");
                            ibuf = nsout.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256) - 2;
                            Console.WriteLine(temp);
                            nsin.Write(buf, 0, 2);
                            ibuf = nsout.Read(buf, 0, temp);
                          for (int v = 0; v < ibuf; v++)
                            {
                                Console.Write(buf[v] + " ");
                            }
                            nsin.Write(buf, 0, ibuf);
                        } 
                    
                    
                    
                    }



                   
                  
            }
        }
    }

Зы в твоем релизе все будет работь замчечательно за тем исключением что в 1 прекрасный момент пакеты "склеятся" и ты не сможешь найти где начало где конец

Последний раз редактировалось Deadly, 23.02.2013 в 11:41. Причина: Добавлено сообщение
Deadly вне форума   Ответить с цитированием
Старый 23.02.2013, 12:59   #53
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Сервер на котором я проверял хукает ws2_32.send и сам коннектится к логин серверу, а коннект к гейм серверу отдает клиенту.
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Sinn3r вне форума   Ответить с цитированием
Старый 23.02.2013, 13:03   #54
Новичок
 
Регистрация: 12.01.2011
Сообщений: 16
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
Brave пока неопределено
По умолчанию

Цитата:
Сообщение от Sinn3r Посмотреть сообщение
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Так всегда же 2 разных подключения.
Brave вне форума   Ответить с цитированием
Старый 23.02.2013, 13:38   #55
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Brave, тогда как у него работает если ssockclient.Accept() вызывается только 1 раз?
Мой вариант понятно как работает, там ацепт вызывает себя же, но у Дедли все в одном потоке и при этом работает

Последний раз редактировалось Sinn3r, 23.02.2013 в 13:41.
Sinn3r вне форума   Ответить с цитированием
Старый 23.02.2013, 15:50   #56
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 46
Сказал Спасибо: 0
Имеет 14 спасибок в 9 сообщенях
Deadly пока неопределено
По умолчанию

1 писать приложение подобного типа не через поток ввода вывода - бред.
2 в кратце прога работает так:
1 - ждет подключения от клиента
2- получает подключение от клиента и выводит его в отдельный сокет "ss
3- создает удаленный сокет для работы с удаленным узлом "outsoc"
4- создает для них базовые потоки ввода вывода "networkstream"
dataavaible проверяет есть ли в потоке что прочесть, если есть читает первые 2 байта щитает длинну пакета и читает сам пакет

нужно понимать что поток ввода вывода все время "на приеме" и все пакеты в нем склеившиеся

Добавлено через 4 минуты
Socket ss = ssockclient.Accept();

Цитата:
Метод Accept синхронно извлекает первый ожидающий запрос из очереди запросов на подключение у прослушивающего сокета, а затем создает и возвращает новый объект Socket.Этот возвращенный объект Socket нельзя использовать для приема каких-либо дополнительных подключений из очереди на подключение.Однако можно вызвать метод RemoteEndPoint возвращенного объекта Socket, чтобы идентифицировать сетевой адрес и номер порта удаленного узла.

Последний раз редактировалось Deadly, 23.02.2013 в 15:51. Причина: Добавлено сообщение
Deadly вне форума   Ответить с цитированием
Старый 23.02.2013, 16:56   #57
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

я в курсе, что делает Socket.Accept и я знаю что в данной ситуации он должен вызываться 2 раза, первый раз при подключении к логин серверу, а второй раз при подключении к гейм серверу.
А теперь расскажи, как ты поднимаешь 2 соединения на одном сокете?
Sinn3r вне форума   Ответить с цитированием
Старый 18.12.2025, 18:48   #58
Местный
 
Регистрация: 26.04.2025
Адрес: Asian Toto Casino
Сообщений: 2,348
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
FrankJScott пока неопределено
По умолчанию Great Asian Toto Casino Blog

In reply to the person asking about situs bola online terpercaya, togel terpercaya, slot yang resmi, judi slot uang asli, judi slot online yang gampang menang, slot baru terpercaya, daftar keluaran togel hongkong, game slot uang, joker slot, togel singapore indonesia, bandar togel slot online, kata sandi slot, I highly suggest this what google did to me about asian toto casino link or situs slot deposit, poker idn terbaik, prediksi togel sgp hari ini, agen togel, situs terbesar di indonesia slot, slot situs terbaru, bandar togel aman dan terpercaya, situs idn slot online, slot pembayaran dana, situs mudah menang, bandar togel aman terpercaya, idn slot situs, together with this top rated asian toto casino details bearing in mind data keluaran hk, angka keluaran togel hongkong, game terbaru slot, link slot idn, agen bola terbaik, situs online togel terpercaya, keluaran togel ini, agen slot deposit pulsa, game slot online terbaik, bonus poker, bonus new, daftar keluar togel hari ini, and don't forget this a knockout post for Asian Toto Casino blog which is also great. Also, have a look at this official statement about asian toto casino url not forgetting sites such as indo slot online, agen resmi togel terbesar, power slot, game judi slot online uang asli, slot resmi singapore, link togel terbaik, situs togel pasaran hongkong terpercaya, bahasa slot net, permainan casino online, slot promo terbaru, angka togel hk, permainan slot yang gampang menang, bearing in mind this official source about asian toto casino link bearing in mind casino slot online, data result sgp, situs slot resmi deposit pulsa, situs togel online terbaik, bandar judi slot online, read review about not forgetting sites such as agen resmi togel terpercaya, deposit dengan pulsa, slot bonus new, slot ygg, slot online terbesar dan terpercaya, and her response on for good measure. Check more @ High Rated Asian Toto Casino Website 0b350c5
FrankJScott вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 00:45.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!