У сокетов Windows есть странное поведение, когда дело доходит до WSAECONNREFUSED (что означает, что полное заполнение или порт недоступен, см. qaru.site/info/492418/...). Если Windows обнаруживает одно из этих условий, оно повторяет (до) два раза с интервалом 0,5 с. Это означает, что для обнаружения WSAECONNREFUSED при попытке подключения к сокету требуется не менее 1 секунды (http://support.microsoft.com/kb/175523/en-us).
Есть ли способ ускорить это обнаружение, не испортив значения реестра? Мне нужно моделировать отказ от соединений сокетов в unittests. Обходной путь, например, имитация отказавшего соединения с сырыми сокетами, также будет приемлемым.
Вот простой Python script, демонстрирующий проблему:
import errno
import socket
import time
PORT = 50123
def main():
s = socket.socket()
s.bind(('127.0.0.1', PORT))
s.listen(0)
client = socket.socket()
client.connect(('127.0.0.1', PORT))
client2 = socket.socket()
start = time.time()
try:
client2.connect(('127.0.0.1', PORT))
except socket.error as e:
assert e.errno == errno.WSAECONNREFUSED
print 'connection attempt took', time.time() - start
finally:
client2.close()
client.close()
s.close()
if __name__ == '__main__':
main()