检查套接字是否在python中使用

问题描述:

我正在运行一个脚本,该脚本的telnet为terminal server。偶尔当一个实例已经在运行,这将导致已经运行脚本失败与检查套接字是否在python中使用

EOFError: telnet connection closed

脚本启动是否有一个快速和容易pythonic的方法来检查,如果需要的插座已在使用上客户端电脑在我尝试打开与telnetlib的连接之前?

SOLUTION:

我想避免一个子进程调用但因为我没有在客户端计算机上控制软件和其他程序可以使用相同的插槽,下面的文件锁的建议(好主意)不会为我工作。我结束了使用SSutrave的建议。下面是使用netstat命令在Windows 7我的工作代码:

# 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中导入subprocess库来运行以下linux命令netstat | grep 'port number' | wc -l来检查打开的端口。

没有知道如果服务器有其他打开的连接,你尝试连接到它以前的标准方式。你必须要求它或者连接到服务器中的另一个服务器来检查它,或者询问其他客户端,如果你知道所有这些服务器。

也就是说,telnet服务器应该能够一次处理多个连接,所以如果有更多的客户端连接,应该无关紧要。

+0

我遇到的问题不在服务器端。这是意外地在同一台客户机上运行脚本两次。我的脚本调用'tn = telnetlib.Telnet(host = 10.10.10.15,port = 8001)'。如果脚本在第一次关闭之前再次运行。第一个实例获取'EOFError:telnet连接关闭'。 – MrPat

+1

@MrPat这是一个服务器端问题,因为当新服务器到达时,服务器关闭已经存在的连接。你可以用文件锁来解决这个问题(在脚本运行的时候创建一个文件,并且在开始时,如果文件存在,它不做任何事情就完成了)。 –

+0

不幸的是,这肯定是客户端问题:如果我在计算机A上运行脚本,然后在A仍在运行时在计算机B上运行脚本,则B的连接尝试会被服务器拒绝,并且A继续工作良好。但是,如果我在计算机A上运行脚本(称为A1),然后在A上运行脚本(称为A2),则A1失败,并且A2开始新的连接。 A2也会失败,但是原因不同。 – MrPat