Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием