2016-02-20 3 views
0

Я создал прозрачный прокси-сервер для фиксации входящих данных, но я хочу, чтобы все данные из прослушивающего обратного вызова в основном потоке (где я открыл сокет). Каков наилучший способ сделать это на C#?Получить данные из обратного вызова прослушивателя tcp в основном потоке

Я использую библиотеку TrotiNet плюс некоторая логика перезаписи - исправление заголовка ответа. Простой код - следующий

using System; 
using TrotiNet; 

namespace TrotiNet.Example 
{ 
    public class TransparentProxy : ProxyLogic 
    { 
     public TransparentProxy(HttpSocket clientSocket) 
     : base(clientSocket) { } 

     static new public TransparentProxy CreateProxy(HttpSocket clientSocket) 
     { 
      return new TransparentProxy(clientSocket); 
     } 

     protected override void OnReceiveRequest() 
     { 
      Console.WriteLine("-> " + RequestLine + " from HTTP referer " + 
       RequestHeaders.Referer); 
     } 

     protected override void OnReceiveResponse() 
     { 
      Console.WriteLine("<- " + ResponseStatusLine + 
      " with HTTP Content-Length: " + 
      (ResponseHeaders.ContentLength ?? 0)); 
     } 
    } 

    public static class Example 
    { 
     public static void Main() 
     { 
      int port = 12345; 
      bool bUseIPv6 = false; 

      var Server = new TcpServer(port, bUseIPv6); 
      Server.Start(TransparentProxy.CreateProxy); 

      Server.InitListenFinished.WaitOne(); 
      if (Server.InitListenException != null) 
       throw Server.InitListenException; 

      while (true) 
      { 
       //need to get the response data here 
       System.Threading.Thread.Sleep(1000); 
      } 

      //Server.Stop(); 
     } 
    } 
} 

Так в основном, мне нужно, чтобы получить все данные, которые поступают в OnReceiveResponse в основном потоке (Example.Main исполнителе). Я делаю такой прокси для одного вызова - так что данные не более 1 КБ.

+0

могли бы вы предоставить более подробную информацию? Показывать код инициализации и управления соединением, также каждый орган должен знать код с вами, обрабатывая данные в основном потоке, и какую сумму вы хотите сохранить? – gabba

ответ

1

Вероятно, вы подходите в производитель/потребитель шаблон, попробуйте использовать BlockingCollection он поддерживает «Параллельное добавление и изъятие предметов из нескольких потоков»

(https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx), как это:

BlockingCollection<Data> dataItems = new BlockingCollection<Data>(100); 

в вашем dataReceiver обработчик сделать

dataItems.Add(data); 

в основной нити потребителя:

data = dataItems.Take(); 

Также лучше заменить петлю бесконечности сна Console.Readkey()

+0

Ты сделал мой день! Спасибо! – zobber

+0

Добро пожаловать. До встречи на сайте http://ru.stackoverflow.com/ – gabba

Смежные вопросы