检查python中是否正在使用套接字
我正在运行一个脚本,该脚本远程登录到检查python中是否正在使用套接字,python,windows,sockets,netstat,terminal-server,Python,Windows,Sockets,Netstat,Terminal Server,我正在运行一个脚本,该脚本远程登录到终端服务器。有时在一个实例已经运行时启动脚本,这会导致已经运行的脚本失败 EOFError:telnet连接已关闭 在我尝试打开与telnetlib的连接之前,是否有一种快速简便的pythonic方法来检查客户端计算机上是否已经使用了所需的套接字 解决方案: 我想避免进行子进程调用,但由于我不控制客户端计算机上的软件,而且其他程序可能使用相同的套接字,下面的文件锁定建议(一个好主意)对我不起作用。我最终采纳了Ssurave的建议。以下是我在Windows 7中
终端服务器
。有时在一个实例已经运行时启动脚本,这会导致已经运行的脚本失败
EOFError:telnet连接已关闭
在我尝试打开与telnetlib
的连接之前,是否有一种快速简便的pythonic方法来检查客户端计算机上是否已经使用了所需的套接字
解决方案:
我想避免进行子进程调用,但由于我不控制客户端计算机上的软件,而且其他程序可能使用相同的套接字,下面的文件锁定建议(一个好主意)对我不起作用。我最终采纳了Ssurave的建议。以下是我在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
在您尝试连接到服务器之前,没有一种标准方法可以知道服务器是否有其他打开的连接。您必须询问它是否连接到检查它的服务器中的另一个服务,或者询问其他客户机(如果您知道所有客户机)
这就是说,telnet服务器一次应该能够处理多个连接,因此无论是否连接了多个客户端。在您尝试连接到服务器之前,没有一种标准方法可以知道服务器是否有其他打开的连接。您必须询问它是否连接到检查它的服务器中的另一个服务,或者询问其他客户机(如果您知道所有客户机)
也就是说,telnet服务器应该能够一次处理多个连接,因此,如果连接了更多的客户端,这应该无关紧要。您可以通过导入python中的
子进程库来运行以下linux命令netstat | grep'port number'| wc-l
来检查打开的端口。您可以通过运行以下linux命令netstat | grep'port来检查打开的端口通过导入python中的子流程
库来编号'| wc-l
。我遇到的问题不在服务器端。这是因为在同一台客户机上意外地运行了两次脚本。我的脚本调用tn=telnetlib.Telnet(主机=10.10.10.15,端口=8001)
。如果在第一次关闭之前再次运行脚本。第一个实例关闭了eoferor:telnet连接
@MrPat,这是服务器端的问题,因为当新的连接到达时,您的服务器会关闭已经存在的连接。您可以使用文件锁来解决这个问题(在脚本运行时创建一个文件,如果文件存在,则在开始时不做任何操作即可完成)。遗憾的是,这肯定是一个客户端问题:如果我在计算机a上运行脚本,然后在计算机B上运行脚本,而计算机a仍在运行,服务器拒绝了B的连接尝试,A继续正常工作。但是,如果我在计算机A上运行脚本(称为A1),然后在A上再次运行脚本(称为A2),则A1将失败,A2将启动新连接。A2也会失败,但原因不同。@MrPat多么奇怪的服务器,可能每个IP地址只允许一个连接?如果脚本不能在它们之间进行通信,那就不可能是客户端问题!我想我已经搞定了:这是一个终端服务器,每个网络端口(8001-8032)代表一个物理串行端口(1-32)。一旦套接字打开,服务器将拒绝任何其他主机的连接尝试。但是,如果服务器接收到来自同一主机的第二个连接,它将假定客户端出现问题,并且客户端已重新启动。服务器关闭第一个连接并打开一个新连接。服务器设计用于在这种特定情况下关闭连接,因此客户端必须在尝试连接之前进行自我检查。谢谢阿尔瓦罗!我遇到的问题不在服务器端。这是因为在同一台客户机上意外地运行了两次脚本。我的脚本调用tn=telnetlib.Telnet(主机=10.10.10.15,端口=8001)。如果在第一次关闭之前再次运行脚本。第一个实例关闭了eoferor:telnet连接
@MrPat,这是服务器端的问题,因为当新的连接到达时,您的服务器会关闭已经存在的连接。您可以使用文件锁来解决这个问题(在脚本运行时创建一个文件,如果文件存在,则在开始时不做任何操作即可完成)。遗憾的是,这肯定是一个客户端问题:如果我在计算机a上运行脚本,然后在计算机B上运行脚本,而计算机a仍在运行,服务器拒绝了B的连接尝试,A继续正常工作。但是,如果我在计算机A上运行脚本(称为A1),然后在A上再次运行脚本(称为A2),则A1将失败,A2将启动新连接。A2也会失败,但原因不同。@MrPat多么奇怪的服务器,可能每个IP地址只允许一个连接?如果脚本不能在它们之间进行通信,那就不可能是客户端问题!我想我已经搞定了:这是一个终端服务器,每个网络端口(8001-8032)代表一个物理串行端口(1-32)。一旦套接字打开,服务器将拒绝任何其他主机的连接尝试。但是,如果服务器接收到来自同一主机的第二个连接,它将假定客户端出现问题,并且客户端已重新启动。服务器关闭第一个连接并打开一个新连接。服务器设计用于在这种特定情况下关闭连接,因此客户端必须在尝试连接之前进行自我检查。谢谢阿尔瓦罗!