【问题标题】:SocketException preventing use of C# TCPListener in Windows ServiceSocketException 阻止在 Windows 服务中使用 C# TCPListener
【发布时间】:2011-02-16 07:44:05
【问题描述】:

我有一个 Windows 服务,它在启动时会执行以下操作。通过控制台应用程序运行时,它工作正常,但是一旦我放入 Windows 服务,我就会得到以下异常。到目前为止,这是我尝试过的:

  • 禁用防火墙,还尝试为 exe、端口和协议添加明确的排除项
  • 已检查 CAS 策略配置,显示不受限制的权限
  • 将服务配置为作为管理员帐户、本地系统、本地服务和网络服务运行,每个都具有相同的结果
  • 尝试了不同的端口
  • 也试过 127.0.0.1 只是为了看看...同样的问题

这让我很头疼,所以任何帮助将不胜感激:

代码:

var _listener = new TcpListener(endpoint); //192.168.2.2:20000
_listener.Start();

产生的异常:

Service cannot be started. System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at System.Net.Sockets.TcpListener.Start(Int32 backlog)
   at System.Net.Sockets.TcpListener.Start()
   at Server.RequestHandler.StartServicingRequests(IPEndPoint endpoint)
   at Server.Server.StartServer(String[] args)
   at Server.Server.OnStart(String[] args)
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

【问题讨论】:

  • 你能告诉我们你用来配置端点的代码吗?这里有更多信息,但我不确定它会帮助你support.microsoft.com/kb/819124
  • 当然,端点是使用“new IPEndPoint(IPAddress.Parse(args[0]), Convert.ToInt32(args[1]))”设置的。这些参数是通过服务控制面板传入的,我已经确认本地机器IP地址设置为192.168.2.2,端口设置为20000,虽然我也尝试过其他端口。
  • 您运行的是什么操作系统? .NET 框架的哪个版本?另外,您能否确保没有内核模式或用户模式进程绑定到该端口(netstat -n -a -P TCP)?

标签: c# exception sockets permissions tcplistener


【解决方案1】:

我建议您使用 IPAddress.Any (0.0.0.0) 和特定端口绑定到端点。

错误消息可能是因为另一个应用程序已经打开了该端口或最近打开了它exclusively

【讨论】:

  • IPAddress.Any 实际上是 0.0.0.0
  • 你当然是对的!我不知道为什么我把广播值而不是任何值...
【解决方案2】:

有关错误代码的更多信息是on MSDN

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多