Конференция "Сети" » Вопрос про сокеты, а точнее про FD_CLOSE и FD_READ [D6, Win95/98, WinME, Win2k, WinXP]
 
  • __Unnamed__ (03.10.07 18:16) [20]
    Я извиняюсь за назойливость, коментарии по 18 и 19 будут? :)
  • Сергей М. © (04.10.07 08:33) [21]

    > как показывает практика еще ниразу не было такого, что описанная
    > в 18 топике конструкция выдавала бы блоьше 8Кб


    Все правильно.
    Этот дифолт определен опциями SO_SNDBUF и SO_RCVBUF на сторонах передатчика и приемника соответственно.

    см. Get/SetSockOpt
  • __Unnamed__ (04.10.07 12:14) [22]
    >>Сергей М.

    Я просто уже не знаю что делать, как мне кажеться, WSAEWOULDBLOCK у меня в чтении произойти не может. И в тоже время приходит раньше FD_CLOSE чем опустеет буфер приемника :/.

    >>DVM
    Просто поймите меня правильно, логика основанная на Асинх/Синхр сокетах должна одинаково получать данные от передающего. Если только вы не намекаете на RECV(...)=0 ==FD_CLOSE, но тут возникает вопрос, почему приходит FD_CLOSE раньше, чем освободится буфер.

    Я уже наверное всех достал :) Ну не могу я понять этого...!!!!??????
  • Сергей М. © (04.10.07 12:28) [23]

    > как мне кажеться, WSAEWOULDBLOCK у меня в чтении произойти
    > не может.


    Ну да, не может, ведь ты вызываешь ф-цию recv() как реакцию на событие FD_READ.
    Но тем не менее, если бы эта "ошибка" фигурировала, в лог ты ее записал бы, хотя ошибкой такая ситуация на самом деле не является.


    > почему приходит FD_CLOSE раньше, чем освободится буфер


    > сервер не мой


    Тогда откуда ты знаешь, что сервер вызывает shutdown ?
    И тем более откуда ты знаешь, с какаим how-параметром сервер вызывает эту функцию ?

    Кстати, рекомендацией Slym ©   (02.10.07 04:32) [5] ты воспользовался ?
  • Сергей М. © (04.10.07 12:38) [24]
    Цитата из справки:

    If how is SD_SEND, subsequent sends are disallowed. For TCP sockets, a FIN will be sent

    Из этого следует, что если партнер по соединению запустил асинхронный send, после чего немедленно выполнил shutdown(SD_SEND), вместо ожидаемого тобой SYN ты запросто можешь получить FIN, что как раз и означает потерю того финального шматка потока, передаваемого тебе партнером.
  • Сергей М. © (04.10.07 12:40) [25]

    > асинхронный send


    Не только асинхронный - и синхронный тоже.
  • __Unnamed__ (04.10.07 12:42) [26]
    1. Сервер Apache но локально(хотя это не имеет значения)
    2. Рекомендации Slym-а смотрел см [9], я так и делал просто когда писал вопрос, первое что в голову пришло это было FD_CLOSE :)

    Как можно проверить с каким пар-ром ShutDown был выполнен с серверной стороны? Я про это еще нигде не видел примеров и статей :)
    Я со своей стороны выполняю всегда ShutDown(FServerS, ??_BOTH);
  • Сергей М. © (04.10.07 12:42) [27]
    Короче, сервер вполне м.б. "кривым".

    Ну а твоя "кривизна" как клиента исправляется задействованием WSAEnumNetWorkEvents
  • __Unnamed__ (04.10.07 12:42) [28]
    Ну и CloseSocket после ShutDown соотвественно :)
  • Сергей М. © (04.10.07 12:44) [29]

    > Как можно проверить с каким пар-ром ShutDown был выполнен
    > с серверной стороны?


    Кроме анализа текста сервера - никак.
    Кстати, Апач - опенсурсный продукт.


    > Я со своей стороны выполняю всегда ShutDown(FServerS, ??
    > _BOTH);


    Нафига ?
  • Сергей М. © (04.10.07 12:46) [30]

    > я так и делал


    Ну так первым дело м при этом ты должен был искать в списке событий, возвращенных вызовом этой ф-ции, событие FD_READ и только потом FD_CLOSE, но не наоборот.
  • __Unnamed__ (04.10.07 12:47) [31]
    Я столкнулся с такой проблемой, когда я не выполняю ShutDown сам Апаче сервер не закрывает со своей стороны Гнезда и ждет непонятно чего??!!!!!
    А с ShutDown все нормально :)
  • Сергей М. © (04.10.07 12:48) [32]

    > когда я не выполняю ShutDown сам Апаче сервер не закрывает
    > со своей стороны Гнезда и ждет непонятно чего


    Быть того не может.

    Если ты выполнил без ошибок closesocket, то рано или поздно партнер получит FIN.
  • __Unnamed__ (04.10.07 12:49) [33]
    >>Сергей М. ©

    Ну так первым дело м при этом ты должен был искать в списке событий, возвращенных вызовом этой ф-ции, событие FD_READ и только потом FD_CLOSE, но не наоборот.


    См. топик [9]!!!
  • Сергей М. © (04.10.07 12:51) [34]
    Весьма полезным будет также изучить поведение гнезда при его закрытии при взведенной и сброшенной опции SO_LINGER
  • __Unnamed__ (04.10.07 13:01) [35]
    Т.е. при SO_LINGER = TRUE с моей стороны, все данные будут приняты?
    Или это только для посылки?
  • Сергей М. © (04.10.07 13:12) [36]
    Это, в свою очередь, зависит от Interval.
  • Сергей М. © (04.10.07 13:16) [37]
    Подозреваю, что где-то что-то ты недопонимаешь.

    Вряд ли Апач будет рвать соединение не передав полностью запрошенные у него данные, если на то нет веских причин.

    Пробуй ту же логику в блокирующем режиме. Если все будет ок, то неправ ты, иначе Апач.
  • __Unnamed__ (04.10.07 20:28) [38]
    Скажи, а если у меня происходит скажем задержка потока на 1-5 секунды в связи с записью на устройство. И чтение из буфера приемника задерживается, то по логике TCP FIN прийдет только тогда, когда Апач полностью передаст данные, ну или у него SO_LINGER=False и прийдет дисконнект но в буфере приемника может быть где-то до 8-64Кб информации как я понимаю.

    И мне кажеться в моем случае, мне прийдется анализировать
    <Content-length:?????> + FD_CLOSE и его ошибки. Если при дисконнекте произошли ошибки, то выходить иначе читать до тех пор пока не будет равно ожидаемого.
  • Сергей М. © (05.10.07 08:58) [39]
    Даже если поступил FIN, данные в буфере приема твоего гнезда, если они там действительно имеются, никуда не денутся, и ты сможешь их прочитать в любой момент до закрытия своего гнезда.


    > мне прийдется анализировать
    > <Content-length:?????>


    Да, придется.
 
Конференция "Сети" » Вопрос про сокеты, а точнее про FD_CLOSE и FD_READ [D6, Win95/98, WinME, Win2k, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]