Комментарии 3
Я в своём софте обычно ставлю таймер и если после 200...500 мС после закрытия сокета, он ещё не закрыт, то делаю аборт, что гарантировано и мгновенно освобождает сокет. Да, приходится хранить список закрытых сокетов и периодически по нему проходить, чтобы закрыть зависшие. Зато никаких проблем. Принудительное закрытие сокета зависит от ОС/языка/библиотеки. У некоторых явно такая функция есть, а у некоторых приходится сначала опции сокета выставлять (всякие там linger off и тому подобное), а потом делать повторный close, который приведёт к мгновенному закрытию.
Да и, кстати, для открытия сокетов такой же подход — если accept не привел к открытию сокета за установленный таймаут, то сокет принудительно закрывается. Стандартные таймауты очень большие и сервер легко зафлудить. Когда писал нагруженный сервер, то там вообще для полу-открытых / полу-закрытых сокетов таймаут зависел от количества ожидающих этих самых сокетов. Если много таких сокетов, то таймаут уменьшался вплоть до 50 мС.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
«Address Already in Use» или как избежать проблем при завершении TCP соединения