На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> simple TCP Server , помогите разобраться с ошибкой
    Написал небольшой ТСР сервер .. вроде бы все ок... но корректно работает через раз
    каждый второй клиент зависает в cListener.AcceptTcpClient() ... при дебаге на строчке тайм-аут ексепшн
    скорее всего что-то где-то упустил.. было бы неплохо если бы хто-то подсказал что именно... код ниже..
    ExpandedWrap disabled
       class Server
          {
              private TcpListener listener;
              private bool working = false;
              private const int port = 54321;
              public static ManualResetEvent tcpClientConnected = new ManualResetEvent(true);
       
       
              public Server()
              {          
                  string hostname = Dns.GetHostName();
                  IPAddress localIP = Dns.GetHostAddresses(hostname)[0];
                  listener = new TcpListener(localIP, port);                    
              }
       
              public bool StartServer()
              {
                  Console.WriteLine("start server "+working);
                  listener.Start();
                  working = true;          
                  while (working)
                  {
                      try
                      {
                          tcpClientConnected.Reset();
                          IAsyncResult asyncResult = listener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptSocketCallback), listener);                  
                          tcpClientConnected.WaitOne();
                      }
                      catch (Exception ex)
                      {
                          Console.WriteLine(ex.Message);
                      }
                  }
                  return true;
              }
              public static void DoAcceptSocketCallback(IAsyncResult ar)
              {
                  Console.WriteLine("accept incomming connection");
                  TcpListener cListener = (TcpListener)ar.AsyncState;          
                
                  TcpClient client = cListener.AcceptTcpClient();//timeout exception
                  Console.WriteLine("crete tcp client");
                  
                  Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientConnection));
                  clientThread.Start(client);
                  tcpClientConnected.Set();
              }
       
              private static void HandleClientConnection(Object client)
              {
                  Console.WriteLine("Client handle");          
              }
       
          }
    Сообщение отредактировано: AlexSaaa -
      а зачем тебе DoAcceptSocketCallback статик?
      у тебя в единицу времени обрабатывается один запрос пулом потоков.
      потому и простои. сделай его методом класса.

      з.ы.

      используй пулл потоков вместо трида. это и эффективнее и быстрее:
      ExpandedWrap disabled
                /// <summary>
                /// CONSTRUCTOR
                /// </summary>
                public TCPWorker()
                {
                    //Увеличиваю пулл потоков
                    int iThreadCount;
                    int iPortsCount;
                    ThreadPool.GetMinThreads(out iThreadCount, out iPortsCount);
                    ThreadPool.SetMinThreads(iThreadCount + 10, iPortsCount + 20);
                    .....
                }
         
         
         
                /// <summary>
                /// Прослушивание сокета
                /// </summary>
                public void Listening()
                {
                    if (Listener != null)
                    {
                        Listener.Start();
                        while (!StopThread)
                        {
                            while (!Listener.Pending())
                                Thread.Sleep(Delay);
                            ThreadPool.QueueUserWorkItem(new WaitCallback(WorkWithClient), Listener.AcceptTcpClient());
                        }
                        Listener.Stop();
                    }
                    else
                        RaiseEvent("Объект Listener не создан в потоке прослушивания");
                }
         
         
         
                /// <summary>
                /// Работа с клиентом
                /// </summary>
                /// <param name="o">TcpClient</param>
                private void WorkWithClient(Object o)
                {
                    TcpClient client = o as TcpClient;
                    if (client == null) return;
                ....
                }
      Сообщение отредактировано: Mr_Smith -
        Спасибо за консультацию...
        на самом деле ошибка была еще глупее
        Почему-то вставил TcpClient client = cListener.AcceptTcpClient(); вместо EndReceive
        такие глупые ошибки найти труднее всего..
        а относительно Пула потоков.. наверное так и сделаю
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0200 ]   [ 16 queries used ]   [ Generated: 26.04.24, 23:20 GMT ]