Страниц: [1]
  Печать  
Автор Тема: Время жизни сокета.  (Прочитано 3048 раз)
bessonov
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Мая 26, 2003, 06:34:00 pm »

Добрый день!
на компе два процесса: сервер и клиент, соединяются через сокет.
процессы работают в цикле: соединяются передают данные, разъединяются.
проблема:
первое соединение проходит, второе не проходит, пишет ошибку "сокет занят", хотя сокеты закрываю нормально.
вопрос:
почему соединения после первого не проходят?
всем заранее спасибо.
[addsig]
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #1 : Мая 26, 2003, 07:21:00 pm »


bessonov пишет:
Добрый день!
на компе два процесса: сервер и клиент, соединяются через сокет.
процессы работают в цикле: соединяются передают данные, разъединяются.
проблема:
первое соединение проходит, второе не проходит, пишет ошибку "сокет занят", хотя сокеты закрываю нормально.
вопрос:
почему соединения после первого не проходят?


Информации мало... детальнее надо...

Первое, что нужно проверить (на это подталкивает и "соединяются передают данные, разъединяются" - что такое разъединяются - close()?) - это timewait. Как проверить? ... простейшее - сделать 2-е соединение через >2-3 мин., BSD timewait регламентируется, по моему, 120сек., но в QNX я видел что-то побольше... Если с такой паузой будет ОК - то timewait. Как лечить: setsockopt() с параметром SOL_REUSEADDR или как-то похоже называется, посмотрите...
Записан
bessonov
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Мая 26, 2003, 07:25:00 pm »


Olej пишет:

bessonov пишет:
Добрый день!
на компе два процесса: сервер и клиент, соединяются через сокет.
процессы работают в цикле: соединяются передают данные, разъединяются.
проблема:
первое соединение проходит, второе не проходит, пишет ошибку "сокет занят", хотя сокеты закрываю нормально.
вопрос:
почему соединения после первого не проходят?


Информации мало... детальнее надо...

Первое, что нужно проверить (на это подталкивает и "соединяются передают данные, разъединяются" - что такое разъединяются - close()?) - это timewait. Как проверить? ... простейшее - сделать 2-е соединение через >2-3 мин., BSD timewait регламентируется, по моему, 120сек., но в QNX я видел что-то побольше... Если с такой паузой будет ОК - то timewait. Как лечить: setsockopt() с параметром SOL_REUSEADDR или как-то похоже называется, посмотрите...



да закрывается close();
[addsig]
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #3 : Мая 26, 2003, 09:10:00 pm »


bessonov пишет:
да закрывается close();


Тогда на закрывающей стороне возникает taimwait состояние, которое имеет продолжительность ~2-3-5 мин. (2*RTT-max в сети) ... оно и препятствует созданию сокета-дубликата.

P.S. taimwait можно и отменить, см. выше ... но это может быть и чревато - его совсем не "просто так" придумали - лучше пересмотреть логику приложения.
Записан
Страниц: [1]
  Печать  
 
Перейти в: