Re[4]: Вопрос насчет сокетов
От: Tanketka  
Дата: 11.07.07 08:50
Оценка:
Здравствуйте, Svjat, Вы писали:

S>Здравствуйте, Tanketka, Вы писали:


T>>Только теперь это нужно сделать на C#, и многопоточной,


S>
S>class Proxy
S>{
S>   private Socket ListenerSocket;
S>   List<ProxySession> Session = new List<ProxySession>();

S>   public void Start( IPAddress ip, int port )
S>   {
S>       Socket ListenerSocket = new Socket();
S>       ListenerSocket.Bind( new IPEndPoint( ip, port ) );
S>       ListenerSocket.Listen();
S>       ListenerSocket.BeginAccept( OnAccept );
S>   }
    
S>   private void OnAccept( IAsyncResult ar )
S>   {
S>       // создаем новую сессию на входящее соединение от браузера
S>       ProxySession session = new ProxySession( ListenerSocket.EndAccept( ar ) );

S>       // подписываемся на события
S>       //session.OnClosed += OnSessionClosed; 
S>       //......

S>       Session.Add( session );
S>       session.Start();
S>   }
S>}

S>class ProxySession
S>{
S>   Socket ClientSocket;
S>   Dictionnary<string,Socket> ServerSocket = new Dictionnary<string,Socket>();

S>   public ProxySession( Socket socket ) { ClientSocket = socket; }
S>   public void Start() { ClientSocket.BeginReceive( ...., OnReceive ); }

S>   private void OnReceive( IAsynchResult ar )
S>   {
S>      try
S>      {
S>          ClientSocket.EndReceive( ar );
S>      }
S>      catch( SocketException )
S>      {
S>          // инициатором закрытия сессии может быть только клентсое соединение
S>          //  точнее, его разрыв
S>          CloseSession();      
S>          return;
S>      }
S>      ......
S>      // тут смотрим запрос от браузера, вытаскиваем хост, на кот. идет запрос
S>      // и если у нас нет такого в списке подключенных, то 
S>      //  создаем соотв. новое подключение к веб-серверу
S>      //  причем это нужно делать при каждом запросе от клиента
S>      //  т.е. в рамках одной сессии может быть один конект от клиента,
S>      //  и много подключений к веб-серверам
S>      Socket server = null;
S>      if( !ServerSocket.TryGetValue( hostName, out server )  )
S>      {
S>          server = new Socket( ... );
S>          ServerSocket.Add( hostName, server );
S>      }
S>      server.BeginSend( ..... );
S>      ClientSocket.BeginReceive( ...., OnReceive );
S>   }
S>}
S>



Все вроде сделала, только в OnAccept вываливается исключение:
Object reference not set to instance...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.