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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
 
 
Опции темы Опции просмотра
Старый 23.02.2013, 06:17   #33
Новичок
 
Регистрация: 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 вне форума   Ответить с цитированием
 

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



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

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


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

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

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