Сокет Python не закрывает соединение должным образом

Я новичок в программировании сокетов и столкнулся с загадочной проблемой:

I у меня есть программа для Windows, которую я не могу изменить (проприетарное программное обеспечение), но которая пытается подключиться к определенному IP-адресу и порту с помощью TCP-сокета.

На моем Linux-компьютере я написал небольшой скрипт Python для обслуживания сокета для Win-программы. Это нормально работает, пока не убью свою прогу на линуксе. Первоначальный сокет сервера не закрывается, как указано, и я не могу перезапустить свою программу, пока сокет не будет собран сборщиком мусора.

Если я попробую то же самое с сокетом 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, он завершится нормально. Но при перезапуске скрипта получается сокет. ошибка, указывающая, что адрес уже используется. Примерно через минуту программа снова заработает.

Я также попробовал завершить работу перед закрытием (также известный как conn.shutdown (2) и server.shutdown ...), но это не дало результата.

Есть ли лучший вариант "правильный" способ закрыть оконную розетку? Я упустил что-то принципиальное о сокетах в целом?

Спасибо!

edit: Кажется, я только что увидел здесь ответ: как правильно закрыть сокет в python 2.6?

Хотя я использую python 2.5, он все равно может работать.

9
задан Community 23 May 2017 в 12:10
поделиться