Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查python中是否正在使用套接字_Python_Windows_Sockets_Netstat_Terminal Server - Fatal编程技术网

检查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)。一旦套接字打开,服务器将拒绝任何其他主机的连接尝试。但是,如果服务器接收到来自同一主机的第二个连接,它将假定客户端出现问题,并且客户端已重新启动。服务器关闭第一个连接并打开一个新连接。服务器设计用于在这种特定情况下关闭连接,因此客户端必须在尝试连接之前进行自我检查。谢谢阿尔瓦罗!