-
Я извиняюсь за назойливость, коментарии по 18 и 19 будут? :)
-
> как показывает практика еще ниразу не было такого, что описанная
> в 18 топике конструкция выдавала бы блоьше 8Кб
Все правильно.
Этот дифолт определен опциями SO_SNDBUF и SO_RCVBUF на сторонах передатчика и приемника соответственно.
см. Get/SetSockOpt
-
>>Сергей М.
Я просто уже не знаю что делать, как мне кажеться, WSAEWOULDBLOCK у меня в чтении произойти не может. И в тоже время приходит раньше FD_CLOSE чем опустеет буфер приемника :/.
>>DVM
Просто поймите меня правильно, логика основанная на Асинх/Синхр сокетах должна одинаково получать данные от передающего. Если только вы не намекаете на RECV(...)=0 ==FD_CLOSE, но тут возникает вопрос, почему приходит FD_CLOSE раньше, чем освободится буфер.
Я уже наверное всех достал :) Ну не могу я понять этого...!!!!??????
-
> как мне кажеться, WSAEWOULDBLOCK у меня в чтении произойти
> не может.
Ну да, не может, ведь ты вызываешь ф-цию recv() как реакцию на событие FD_READ.
Но тем не менее, если бы эта "ошибка" фигурировала, в лог ты ее записал бы, хотя ошибкой такая ситуация на самом деле не является.
> почему приходит FD_CLOSE раньше, чем освободится буфер
> сервер не мой
Тогда откуда ты знаешь, что сервер вызывает shutdown ?
И тем более откуда ты знаешь, с какаим how-параметром сервер вызывает эту функцию ?
Кстати, рекомендацией Slym © (02.10.07 04:32) [5] ты воспользовался ?
-
Цитата из справки:
If how is SD_SEND, subsequent sends are disallowed. For TCP sockets, a FIN will be sent
Из этого следует, что если партнер по соединению запустил асинхронный send, после чего немедленно выполнил shutdown(SD_SEND), вместо ожидаемого тобой SYN ты запросто можешь получить FIN, что как раз и означает потерю того финального шматка потока, передаваемого тебе партнером.
-
> асинхронный send
Не только асинхронный - и синхронный тоже.
-
1. Сервер Apache но локально(хотя это не имеет значения)
2. Рекомендации Slym-а смотрел см [9], я так и делал просто когда писал вопрос, первое что в голову пришло это было FD_CLOSE :)
Как можно проверить с каким пар-ром ShutDown был выполнен с серверной стороны? Я про это еще нигде не видел примеров и статей :)
Я со своей стороны выполняю всегда ShutDown(FServerS, ??_BOTH);
-
Короче, сервер вполне м.б. "кривым".
Ну а твоя "кривизна" как клиента исправляется задействованием WSAEnumNetWorkEvents
-
Ну и CloseSocket после ShutDown соотвественно :)
-
> Как можно проверить с каким пар-ром ShutDown был выполнен
> с серверной стороны?
Кроме анализа текста сервера - никак.
Кстати, Апач - опенсурсный продукт.
> Я со своей стороны выполняю всегда ShutDown(FServerS, ??
> _BOTH);
Нафига ?
-
> я так и делал
Ну так первым дело м при этом ты должен был искать в списке событий, возвращенных вызовом этой ф-ции, событие FD_READ и только потом FD_CLOSE, но не наоборот.
-
Я столкнулся с такой проблемой, когда я не выполняю ShutDown сам Апаче сервер не закрывает со своей стороны Гнезда и ждет непонятно чего??!!!!!
А с ShutDown все нормально :)
-
> когда я не выполняю ShutDown сам Апаче сервер не закрывает
> со своей стороны Гнезда и ждет непонятно чего
Быть того не может.
Если ты выполнил без ошибок closesocket, то рано или поздно партнер получит FIN.
-
>>Сергей М. ©
Ну так первым дело м при этом ты должен был искать в списке событий, возвращенных вызовом этой ф-ции, событие FD_READ и только потом FD_CLOSE, но не наоборот.
См. топик [9]!!!
-
Весьма полезным будет также изучить поведение гнезда при его закрытии при взведенной и сброшенной опции SO_LINGER
-
Т.е. при SO_LINGER = TRUE с моей стороны, все данные будут приняты?
Или это только для посылки?
-
Это, в свою очередь, зависит от Interval.
-
Подозреваю, что где-то что-то ты недопонимаешь.
Вряд ли Апач будет рвать соединение не передав полностью запрошенные у него данные, если на то нет веских причин.
Пробуй ту же логику в блокирующем режиме. Если все будет ок, то неправ ты, иначе Апач.
-
Скажи, а если у меня происходит скажем задержка потока на 1-5 секунды в связи с записью на устройство. И чтение из буфера приемника задерживается, то по логике TCP FIN прийдет только тогда, когда Апач полностью передаст данные, ну или у него SO_LINGER=False и прийдет дисконнект но в буфере приемника может быть где-то до 8-64Кб информации как я понимаю.
И мне кажеться в моем случае, мне прийдется анализировать
<Content-length:?????> + FD_CLOSE и его ошибки. Если при дисконнекте произошли ошибки, то выходить иначе читать до тех пор пока не будет равно ожидаемого.
-
Даже если поступил FIN, данные в буфере приема твоего гнезда, если они там действительно имеются, никуда не денутся, и ты сможешь их прочитать в любой момент до закрытия своего гнезда.
> мне прийдется анализировать
> <Content-length:?????>
Да, придется.