作为服务运行时,Windows 不接受套接字连接

Posted

技术标签:

【中文标题】作为服务运行时,Windows 不接受套接字连接【英文标题】:Windows not accepting Socket Connections when running as service 【发布时间】:2021-09-01 02:37:22 【问题描述】:

我正在用 Python 在 Windows 10 上编写一个小应用程序。 它应该监听 TCP 套接字连接并接收一些数据。应用程序不需要任何响应。应用程序必须作为 Windows 服务运行。 在调试模式下运行时,它可以完美运行。它接收数据并处理它。 当作为服务运行时(使用 pyinstaller 和 pywin32 包),不会收到任何数据,也不会发生任何事情。

def sockThread(port: int, interface: str):
    global sock 
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind((interface, port))
    except socket.error as e:
       logging.error('could not open socket connection with' + interface + ":" + str(port))
       logging.error('error: ' + str(e))
       return
    
    
    logging.info("socket timeout: " + str(sock.gettimeout()))
    
    #run:
    while stop==False:
        logging.info("socketthread starting, listening on:" + interface + ":" + str(port))
        try:
            sock.listen(1)
            c, addr = sock.accept()
            #logging.info("socketthread connection accepted")
        except socket.error as e:
            logging.error('error while listening to socket:' + str(e))
        else:
            data = c.recv(2048)
            #logging.info("data received: " + str(data))
            processStarter.startSubProcess(data)
    logging.error("socket thread leaving")

使用 Raspberry Pi 命令行测试代码: netcat -w1 192.168.178.27 60000 <testfile.txt

Windows 服务和应用程序的配置有什么不同吗?

【问题讨论】:

记录了什么错误? NB 您只需要listen() 一次,在bind() 之后。不在循环内。第二次和后续的listen() 调用将失败,正如您的日志记录必须显示的那样。 我需要循环监听,因为客户端不止一次发送数据。我不想每次都重新打开套接字。没有错误记录为服务,也没有连接作为服务。在使用单独的 Main 方法处于调试模式时,按预期工作 不,您确实需要在循环中listen(),因为这不是您使用套接字 API 的方式。您的错误记录应该已经向您展示了这一点。你检查过吗?您需要在循环中接受 好的,那么监听方法的调用应该移到循环前面吗?没有错误:INFO:root:socket timeout:无 INFO:root:socketthread 正在启动,正在侦听:192.168.178.27:60000 编辑:好的,我发现了一个可能的错误根源。让我修复配置文件 我:“你只需要listen() 一次,在bind() 之后。不在循环内。”。你:“我需要循环听。”我:“不,你不需要在循环中listen()。”你:“好的,所以调用listen方法应该移到循环前面吗?”请。 【参考方案1】:

找到“Windows 不接受连接”的解决方案:Windows 防火墙规则对于调试器中的服务和应用程序是不同的。 所以我的代码中仍然存在一些错误,但现在当作为服务运行时,连接现在被接受了。

【讨论】:

【参考方案2】:

Windows 服务必须有专门注册的端口才能监听。

命令是:

netsh http add urlacl url=http://+:PORT/

更多关于add urlacl的信息在这里:https://docs.microsoft.com/pl-pl/windows/win32/http/add-urlacl

【讨论】:

1.不,它没有。 2. 您的链接是关于 URL,而不是端口。 3. 是预约,不是注册。 4. 它不包含任何支持您第一句话中的主张的内容。

以上是关于作为服务运行时,Windows 不接受套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

当服务器接受 TCP 连接时端口会改变吗?

Windows 服务在执行 EndAcceptTcpClient 时意外终止 - 即在接受新的套接字客户端时

在套接字服务器运行时运行单独的代码?

TCP 套接字 - 服务器不接受任何连接 UNIX

postgresql datababse 错误:服务器是不是在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?

从listen and fork 到xinetd