Я новичок в программировании сокетов и столкнулся с загадочной проблемой:
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, он все равно может работать.