История изменений
Исправление
gh0stwizard,
(текущая версия)
:
Теперь я знаю, почему хаскель не надо использовать :)
Первое, что надо знать - закрытие сокета не означает его пропадание из ОС.
Второе, в хаскеле как и во всех других ЯП освобождение fd происходит только тогда, когда его освободила (и перед этим закрыла) программа. Иначе, вступают в силу настройки ОС: TIME_WAIT, FIN_WAIT и т.п. Если сокеты висят в ОС даже после закрытия, значит освободи их программой!
Использовать SO_LINGER нужно только тогда, когда клиент/сервер написаны криво и не умеют закрывать сокеты одновременно. Т.е. один из них игнорирует посылку fin ack.
Кроме close() иногда надо прямо использовать shutdown(fd, 2)
Исправление
gh0stwizard,
:
Теперь я знаю, почему хаскель не надо использовать :)
Первое, что надо знать - закрытие сокета не означает его пропадание из ОС.
Второе, в хаскеле как и во всех других ЯП освобождение fd происходит только тогда, когда его освободила (и перед этим закрыла) программа. Иначе, вступают в силу настройки ОС: TIME_WAIT, FIN_WAIT и т.п. Если сокеты висят в ОС даже после закрытия, значит освободи их программой!
Использовать SO_LINGER нужно только тогда, когда клиент/сервер написаны криво и не умеют закрывать сокеты одновременно. Т.е. один из них игнорирует посылку fin ack.
Исправление
gh0stwizard,
:
Теперь я знаю, почему хаскель не надо использовать :)
Первое, что надо знать - закрытие сокета не означает его пропадание из ОС.
Второе, в хаскеле как и во всех других случаях освобождение fd происходить только тогда, когда его освободила программа. Иначе, вступают в силу настройки ОС: TIME_WAIT, FIN_WAIT и т.п. Если сокеты висят в ОС даже после закрытия, значит освободи их программой!
Использовать SO_LINGER нужно только тогда, когда клиент/сервер написаны криво и не умеют закрывать сокеты одновременно. Т.е. один из них игнорирует посылку fin ack.
Исходная версия
gh0stwizard,
:
Теперь я знаю, почему хаскель не надо использовать :)
Первое, что надо знать - закрытие сокета не означает его пропадание из ОС.
Второе, в хаскеле как и во всех других случаях освобождение fd происходить только тогда, когда его освободила программа. Иначе, вступают в силу настройки ОС: TIME_WAIT, FIN_WAIT и т.п. Если сокеты висят в ОС даже после закрытия, значит освободи их программой!