Прослушиватель TCP IP в службе Windows

Я пытаюсь создать службу Windows, которая должна работать в фоновом режиме и прослушивать входящий трафик (обычный и обычный прослушиватель TCP)

мой код:

private TcpListener server;

public void startServer()
    {
       // EventLog.WriteEntry(source, "connected on: " + ipAddress.ToString() + " port: " + Service1.Port.ToString());

        server = new TcpListener(IPAddress.Parse("127.0.0.1"), Service1.Port);

         server.Start();
        while (true)
        {
          var client = server.AcceptTcpClient();


            new Thread(work).Start(client);

        }

 public void work(object client)
    {
        string msg = null;
        var clientLocal = (TcpClient)client;


            using (NetworkStream ns = clientLocal.GetStream())
            using (StreamReader sr = new StreamReader(ns))
            {
            byte[] msgFullArray = new UTF8Encoding(true).GetBytes(msg);
            fs.Write(msgFullArray, 0, msg.Length);
            }

теперь, если вы вообще не смотрите на метод работы, так как всякий раз, когда я запускаю свой сервис, он зависает всякий раз, когда я пытаюсь запустить его на моем:

 var client = server.AcceptTcpClient();

это означает, что моя служба никогда не использует метод Thread или мой рабочий метод. Из предыдущего ведения журнала я вижу, что он входит в мой цикл while, а затем просто отключает службу.


person Pilsneren    schedule 23.08.2016    source источник
comment
Непонятно, что звонит startServer. Если он напрямую вызывается вашим методом OnStart, это проблема. Как вы заметили, AcceptTcpClient блокируется до тех пор, пока не появится клиент, но поток, для которого вызывается OnStart, не принадлежит вам, и вы не должны его блокировать.   -  person Damien_The_Unbeliever    schedule 23.08.2016
comment
хорошо, вы правы, что мой метод onstart вызывает server.startServer(); но я не уверен, что понимаю, как это исправить тогда?   -  person Pilsneren    schedule 23.08.2016


Ответы (1)


В вашем методе OnStart вы должны создать экземпляр класса сервера.

protected override void OnStart(string[] args)
{
  // Create the Server Object ans Start it.
  server = new TCPServer();
  server.StartServer();
}

который отвечает за обработку подключений к серверу путем создания нового Thread (чтобы это был неблокирующий процесс)

public void StartServer()
{
  if (m_server!=null)
  {
    // Create a ArrayList for storing SocketListeners before
    // starting the server.
    m_socketListenersList = new ArrayList();

    // Start the Server and start the thread to listen client 
    // requests.
    m_server.Start();
    m_serverThread = new Thread(new ThreadStart(ServerThreadStart));
    m_serverThread.Start();

    // Create a low priority thread that checks and deletes client
    // SocktConnection objcts that are marked for deletion.
    m_purgingThread = new Thread(new ThreadStart(PurgingThreadStart));
    m_purgingThread.Priority=ThreadPriority.Lowest;
    m_purgingThread.Start();
  }
}

для каждого сокета, который он будет прослушивать с помощью TCPListener.

private void ServerThreadStart()
{
  // Client Socket variable;
  Socket clientSocket = null;
  TCPSocketListener socketListener = null;
  while(!m_stopServer)
  {
    try
    {
      // Wait for any client requests and if there is any 
      // request from any client accept it (Wait indefinitely).
      clientSocket = m_server.AcceptSocket();

      // Create a SocketListener object for the client.
      socketListener = new TCPSocketListener(clientSocket);

      // Add the socket listener to an array list in a thread 
      // safe fashon.
      //Monitor.Enter(m_socketListenersList);
      lock(m_socketListenersList)
      {
        m_socketListenersList.Add(socketListener);
      }
      //Monitor.Exit(m_socketListenersList);

      // Start a communicating with the client in a different
      // thread.
      socketListener.StartSocketListener();
    }
    catch (SocketException se)
    {
      m_stopServer = true;
    }
  }
}

Вот полная статья проекта .

person Community    schedule 23.08.2016