Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/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_Linux_Sockets_Networking - Fatal编程技术网

Python套接字没有';不要正确地关闭连接

Python套接字没有';不要正确地关闭连接,python,windows,linux,sockets,networking,Python,Windows,Linux,Sockets,Networking,我不熟悉套接字编程,遇到了一个令人费解的问题: 我有一个windows程序,我不能修改它(专有软件),但它试图用tcp套接字连接到特定的ip和端口 在我的linux机器上,我编写了一个小python脚本来为win程序提供套接字。在我在linux上杀死我的程序之前,这一切都很正常。初始服务器套接字未按指定关闭,在套接字被垃圾回收之前,我无法重新启动程序 如果我用linux套接字(在一个单独的python脚本中)尝试同样的方法,我不会有问题 下面是一个简单的代码示例: import socket

我不熟悉套接字编程,遇到了一个令人费解的问题:

我有一个windows程序,我不能修改它(专有软件),但它试图用tcp套接字连接到特定的ip和端口

在我的linux机器上,我编写了一个小python脚本来为win程序提供套接字。在我在linux上杀死我的程序之前,这一切都很正常。初始服务器套接字未按指定关闭,在套接字被垃圾回收之前,我无法重新启动程序

如果我用linux套接字(在一个单独的python脚本中)尝试同样的方法,我不会有问题

下面是一个简单的代码示例:

import socket

server = socket.socket()
server.bind(('192.168.0.111', 50001))
server.listen(1)
conn, addr = server.accept()
print 'Connection established'

running = True
while running:
    try:
        data = conn.recv(4096)
    except KeyboardInterrupt:
        conn.close()
        running = False
    else:
        if data:
            print data
        else:
            conn.close()
            running = False
server.close()
如果我用Ctrl-C终止它,它将正常退出。但是在重新启动脚本时,我得到一个socket.error,说明地址已经在使用中。大约一分钟后,程序又开始工作了

我还尝试在关闭前关闭(aka conn.shutdown(2)和server.shutdown…),但没有效果

有没有更好的“正确”方法来关闭windows套接字?我是否错过了插座的一些基本功能

谢谢

编辑:我想我刚刚在这里看到了答案:


尽管我使用的是python 2.5,但它可能仍然可以工作。

尝试添加import sys并使用sys.exit()终止应用程序。套接字保持保留状态,直到系统确信应用程序已关闭。您可以使用sys.exit()明确说明这一点

[编辑]哦,好的。我对自己是个新手。你是说这个序列不安全?我想不出还有别的办法。你必须用一些技巧在某个时候关闭你的应用程序,对吗?那么它是如何正确地完成的呢

server.shutdown(socket.SHUT_RDWR) 
server.close()
sys.exit()

您正在经历连接的套接字的
TIME\u WAIT
状态。即使你已经关闭了你的插座,它仍然会持续几分钟。原因以及可以设置为禁用该行为的套接字标志(SO_REUSEADDR),将在中解释

总之,

server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(...)
...

我实际上也想到了这一点,并把它写在了我的剧本中。如果这对关闭套接字之前的延迟有影响,则可以忽略不计。我不建议使用sys.exit()。最终可能会出现挂起的套接字,这在Unix上非常罕见,而在Windows上则不常见。如果在windows上挂起套接字,则必须重新启动才能修复。sys.exit()与退出Python进程的任何其他方式都没有什么区别。因此,您的建议归结为“如果您创建了任何套接字,请不要退出”,这有点不切实际。如果您的程序从未退出,您可能也必须重新启动。;)一般来说,Windows是相当脆弱的,防火墙和防病毒软件之类的东西会让它更加脆弱。但是,退出一个套接字打开的进程基本上一直都是安全的,如果不是这样,您的系统将有太多问题,以至于您不会真正注意到一个有问题的Python程序。连接套接字的time_WAIT状态。添加了一些上下文
echo“disconnect”| nc 192.168.1.12 58888-w 1
-从客户端,您可以超时1秒,让服务器有自己的超时时间