作为服务运行时,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 不接受套接字连接的主要内容,如果未能解决你的问题,请参考以下文章
Windows 服务在执行 EndAcceptTcpClient 时意外终止 - 即在接受新的套接字客户端时
postgresql datababse 错误:服务器是不是在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?