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