Вопрос по сокетам в Windows
Такое ощущение, что истекает какой-то таймаутMSL
Используются блокирующие сокеты, все просто, никаких наворотов.Брось ты это дело... Кто же так делает...
А можешь подробнее пояснить, что ты имел в виду? А то как в известном анекдоте про приборы. Или ты просто хотел сказать, что по умолчанию значение MSL в WinXP равно 120 секунд? Это я знаю, конечно. Ты бы лучше объяснил, откуда по истечении этого времени берется RST.
Это сделано просто, потому, что это оправданно решаемой задачей. Масштабируемость там не нужна, и тормозит сейчас совсем не сетевое взаимодействие. Так до сих пор делают много где, не всем же nginx и подобное ПО писать.
Без описания полной картины как бы тоже ни хрена не понятно, потому что изврат с получением данных после shutdown нужен далеко не всем.
а разве неудивительно, что после того, как ты закрыл на чтение сокет, из него ничего не читается?..
Я shutdown вызываю с опцией SHUT_WR, что означает закрытие на запись. Так что твой коммент про попытку читать из закрытого на чтение сокета мне непонятен.
понял. невнимателен. но, всёж.. зачем там shutdown?
Затем, что протокол типа "установили соединение-послали запрос-прочитали ответ-закрыли соединение" и удобно, в нужный момент вызвав shutdown на клиенте, послать серверу сегмент с флагом FIN, указывающий, что запрос отправлен полностью, данных больше не будет. На стороне сервера код, читающий из сокета, получит EOF и будет знать, что запрос вычитан, можно его парсить и писать в сокет ответ. Насколько я знаю, это совершенно обычный подход.
лучше сделать нормальный протокол где в начале идёт размер, или использовать какой-нить стандартный.
боюсь такая фишка в винде не работает
Офигеть. Неужели правда.
лучше сделать нормальный протокол
Если не приду к решению, так и сделаю.
Например .
Ты был прав, использование полузакрытого соединения ненадежно. В Windows, по крайней мере в некоторых версиях, у состояния FIN_WAIT2 есть таймаут. Оставить комментарий
psm-home
Имеется 2 приложения: сервер и клиент, общающиеся по TCP/IP. Протокол обмена примитивный:1. Клиент соединяется, отправляет запрос, вызывает shutdown с параметром SHUT_WR (клиент со своей стороны закрывает соединение вычитывает ответ сервера.
2. Сервер принимает соединение, вычитывает запрос, записывает ответ, закрывает соединение.
Используются блокирующие сокеты, все просто, никаких наворотов. Но. Наблюдается следующее нехорошее поведение. Если сервер генерирует ответ за время, большее 120 секунд, то клиент получает ошибку connection reset. Сниффер показывает, что на фоне совершенно обычного для такой схемы взаимодействия обмена сегментами, клиент почему-то по истечении 120 секунд начинает слать сегменты со взведенным флагом RST. Что это такое может быть? Такое ощущение, что истекает какой-то таймаут, но сокет непосредственно перед обломом находится в FIN_WAIT_2, а для этого состояния таймаута вроде не должно быть. Операционная система - Windows XP, под другими OC пока не смотрел.