Re[2]: Разница в работе с сокетами Windows и Linux
От: Pzz Россия https://github.com/alexpevzner
Дата: 06.10.05 07:27
Оценка:
Gomes wrote:
> 3. shutdown(), close() и closesocket()
> В Windows принято, что после вызова closesocket() соединение
> закрывается. Так же, соединения закрываются при закрытии программы.
> Система знает, какому процессу соответствуют сокеты, и закрывает их при
> смерти приложения. В Linix и FreeBSD это не так.
> Необходимо явно сказать shutdown (посылка FIN) и close (разъединение
> дескриптора и сокета). Если этого не сделать, то после закрытия
> приложения сокеты еще будут висеть в системе некоторое время, в течение
> которого bind на "занятые" порты будет возвращать ошибку.
> Такая же ситуация возникает если вы сделаете на серверной стороне
> приложения shutdown и close, закроете приложение, а на клиентской
> стороне эти ф-ии вызваны не будут. После этого Вы не сможете запустить
> серверное приложение в течении некоторого времени.
> Методы борьбы — не известны. Только ждать.

Метод борьбы — SO_REUSEADDR при открытии соцкета. Причем в виндах и в
унихе эта опция делает разные штуки. В унихе она позволяет занать
TCP-порт, который уже занят другим сокетом в состоянии TIME_WAIT, i не
более того. Т.е. все же "нормальных" сокетов у Вас все равно будет не
более одной штуки на порт. В виндах же Вы, с помощью этой опции, сможете
повесить на один порт сколько угодно нормальных сокетов. Как уж они
будут потом делить этот порт между собой, науке (т.е., мне) неизвестно.
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.