TcpListener.AcceptSocket()在Windows服务中失败

时间:2014-07-22 19:23:32

标签: c# sockets windows-services tcplistener

我有一个以下代码的实例,可以在Debug中正确执行,也可以作为独立的Windows应用程序执行:

TcpListener tcpListener = new TcpListener(IPAddress.Any, 4554);
tcpListener.Start();

while (true)
{
    try
    {
        using (Socket socket = tcpListener.AcceptSocket())
        {
            // Code here is reached in Debug or as a Console Application
            // but not as a Windows Service
        }
    }
    catch (SocketException se)
    {
        // This is never reached
    }
    catch (Exception ex)
    {
        // This is never reached
    }
    finally
    {
        // This is never reached in the Windows Service
    }
}

但是,当我将其安装为Windows服务时,它会在tcpListener.AcceptSocket()上崩溃,并将以下内容记录到事件查看器中:

  

MyService.exe [768]中发生了未处理的异常('System.Net.Sockets.SocketException')。 Just-In-Time调试此异常失败,并出现以下错误:不支持尝试的操作。

即使尝试捕获异常,我也无法再记录任何内容。在Debug中单步调试代码没有任何结果,因为代码成功阻止了应用程序并等待客户端连接。

有没有办法为Windows服务实现这个?

1 个答案:

答案 0 :(得分:1)

usr的建议(以及this answer)让我看到了代码中的错误。 ServiceBase类包含以下内容:

protected override void OnStart(string[] args)
{
    _worker = new Thread(ExecuteService);
    _worker.Start();
}

private void ExecuteService()
{
    for (;;)
    {
         if (_stop.WaitOne(1000))
        {
            new TcpServer().StartTcpServer();
            return;
        }
    }
}

正确的实现是删除for循环,它正在重新实例化侦听器。这是最终的代码:

protected override void OnStart(string[] args)
{
    _worker = new Thread(ExecuteService);
    _worker.Start();
}

private static void ExecuteService()
{
    new TcpServer().StartTcpServer();
}