【问题标题】:Check if socket is in use in python检查套接字是否在python中使用
【发布时间】:2015-10-01 20:14:51
【问题描述】:

我正在运行一个远程登录到terminal server 的脚本。有时脚本在一个实例已经运行时启动,这会导致已经运行的脚本失败并显示

EOFError: telnet connection closed

在我尝试打开与telnetlib 的连接之前,是否有一种快速简便的pythonic 方法来检查客户端计算机上是否已在使用所需的套接字?

解决方案:

我想避免进行子进程调用,但由于我不控制客户端计算机上的软件,并且其他程序可能使用相同的套接字,所以下面的文件锁定建议(一个好主意)对我不起作用。我最终使用了 SSutrave 的建议。这是我在 Windows 7 中使用 netstat 的工作代码:

# make sure the socket is not already in use
try:
    netstat = subprocess.Popen(['netstat','-nao'],stdout=subprocess.PIPE)
except:
    raise ValueError("couldn't launch netstat to check sockets. exiting")
ports = netstat.communicate()[0]
if (ip + ':' + port) in ports:
    print 'socket ' + ip + ':' + port + ' in use on this computer already. exiting'
    return

【问题讨论】:

    标签: python windows sockets netstat terminal-server


    【解决方案1】:

    您可以通过在python中导入subprocess库来运行以下linux命令netstat | grep 'port number' | wc -l来检查开放端口。

    【讨论】:

      【解决方案2】:

      在您尝试连接之前,没有一种标准方法可以知道服务器是否有其他打开的连接。您必须询问它是否连接到检查它的服务器中的另一个服务,或者通过询问其他客户端,如果您知道所有这些。

      也就是说,telnet 服务器一次应该能够处理多个连接,因此连接的客户端是否更多无关紧要。

      【讨论】:

      • 我遇到的问题不在服务器端。这是在同一台客户端机器上意外运行脚本两次。我的脚本调用tn = telnetlib.Telnet(host=10.10.10.15,port=8001)。如果脚本在第一次关闭之前第二次运行。第一个实例获得EOFError: telnet connection closed
      • @MrPat 这是一个服务器端问题,因为当新连接到达时,您的服务器会关闭已经存在的连接。您可以使用文件锁定解决此问题(在脚本运行时创建一个文件,并在启动时创建一个文件,如果该文件存在,它会在不执行任何操作的情况下完成)。
      • 可悲的是,这绝对是客户端问题:如果我在计算机 A 上运行脚本,然后在计算机 B 上运行 A 仍在运行时,B 的连接尝试被服务器拒绝,A继续工作得很好。但是,如果我在计算机 A 上运行脚本(称为 A1),然后在 A 上再次运行(称为 A2),则 A1 失败,A2 启动新连接。 A2 也会失败,但原因不同。
      • @MrPat 这么奇怪的服务器,可能每个 IP 地址只允许一个连接?如果脚本之间没有通信,那不可能是客户端问题!
      • 我想我已经确定了:这是一个终端服务器,每个网络端口(8001-8032)代表一个物理串行端口(1-32)。一旦套接字打开,服务器就会拒绝任何其他主机的连接尝试。但是,如果服务器从同一主机接收到第二个连接,则假定客户端存在问题并且客户端重新启动。服务器关闭第一个连接并打开一个新连接。服务器设计为在这种特定情况下关闭连接,因此客户端在尝试连接之前必须检查自己。谢谢阿尔瓦罗!
      猜你喜欢
      • 2013-07-26
      • 2019-09-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多