Конференция "Сети" » Асинхронные сокеты "забивают" очередь сообщений
 
  • Сергей М. © (03.04.08 17:07) [20]
    Если я правильно понял, ты сочиняешь некий "упрощенный" TClientSocket, способный работать с сервером через некий socks-прокси в "прозрачном" режиме ?
  • Сергей М. © (03.04.08 17:20) [21]

    > Вполне вероятно, что это может оказаться следующая мессага
    > от того же сокета - и тогда SocketEvent будет запущен второй
    > раз


    Откуда ей, этой "мессаге от того же сокета" взяться, если recv() ты вызываешь после Application.ProcessMessages ?

    Очередное FD_READ-событие возникнет не раньше чем будет выполнен вызов recv().

    Равно как и очередной вызов send() следует выполнять не раньше FD_WRITE-события, если оно явилось следствием отказа WSAEWOULDBLOCK при предыдущем вызове send()
  • SpellCaster (04.04.08 13:53) [22]
    > [19] Сергей М. ©   (03.04.08 16:33)
    > Ты о чем - о SOCKS4, о SOCKS5 ?

    Говорил же...
    >Прокси-сервер, работающий по протоколу Socks5.
    Обычный метод, без аутентификации.

    > Ты бросил огрызок код - нате, мол, догадывайтесь сами о
    > том что я не изволил привести и не собираюсь приводить.
    >
    > Ну и какого ответа ты после этого ждешь ?

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

    > для чего нужно всего лишь на время "переговоров" с прокси
    > перевести гнездо в блок.режим

    Хм, это, конечно, вариант... однако прога на время установки соединения будет блокироваться, чего бы не хотелось. Можно еще с неблокирующими сделать, в цикле проверять готовность и периодически вызывать ProcessMessages. Но мне это кажется слегка нелогичным.

    > Если я правильно понял, ты сочиняешь некий "упрощенный"
    > TClientSocket, способный работать с сервером через некий
    > socks-прокси в "прозрачном" режиме ?

    В целом, верно.

    > Откуда ей, этой "мессаге от того же сокета" взяться, если
    > recv() ты вызываешь после Application.ProcessMessages ?

    Воот, наконец-то вернулись к сути вопроса. Разумеется, я не имел в виду FD_READ. Но ведь событие может быть и другим, например, FD_CLOSE. Тогда-то и случится засада: если я вызову Application.ProcessMessages в начале обработчика FD_READ, будет вызван обработчик FD_CLOSE, который спокойно закроет сокет и вернет управление обработчику FD_READ, который будет безуспешно пытаться прочитать данные из закрытого сокета. Так ведь получается?

    > Равно как и очередной вызов send() следует выполнять не
    > раньше FD_WRITE-события, если оно явилось следствием отказа
    > WSAEWOULDBLOCK при предыдущем вызове send()

    Учту...
  • Сергей М. © (04.04.08 14:30) [23]

    > если я вызову Application.ProcessMessages в начале обработчика
    > FD_READ


    Событие готовности гнезда к чтению предполагает чтение из гнезда, а не выкрутасы с польз.интерфейсом !


    > FD_CLOSE, который спокойно закроет сокет и вернет управление
    > обработчику FD_READ, который будет безуспешно пытаться прочитать
    > данные из закрытого сокета


    Ну и что ? Первая же попытка чтения вернет отказ, на который твой обработчик должен адекватно отреагировать.
  • SpellCaster (04.04.08 17:31) [24]
    > Событие готовности гнезда к чтению предполагает чтение из
    > гнезда, а не выкрутасы с польз.интерфейсом !

    А я что, спорю? Предложи альтернативный способ, я его с радостью рассмотрю.

    > Ну и что ? Первая же попытка чтения вернет отказ, на который
    > твой обработчик должен адекватно отреагировать.

    Да, но пришедшие данные будут утеряны!
  • Сергей М. © (04.04.08 21:57) [25]

    > Предложи альтернативный способ, я его с радостью рассмотрю


    Альтернатив нет - сначала recv(), а потом выкрутасы.

    Не нравится ?

    Выноси транспорт с его событиями в доп.поток.


    > пришедшие данные будут утеряны


    С чего ты так уверен ?
  • SpellCaster (09.04.08 14:10) [26]
    > С чего ты так уверен ?

    Из закрытого сокета вроде как читать не получится...
    Хорошо, тогда будет 2 вопроса:
    1) Как организовать обработку событий сокета в отдельном потоке, потому что мессаги все равно ведь приходят в Application. Возможно, их надо фильтровать по коду мессаги?

    2) Как насчет варианта вместо ProcessMessages сделать свой аналог, который будет извлекать из очереди только сообщения, не относящиеся к сокетам.
  • Сергей М. © (09.04.08 14:24) [27]

    > Из закрытого сокета вроде как читать не получится


    Чтение-то не из сокета происходит, а из внутреннего буфера приема !

    Если там что-то имеется на момент закрытия сокета, то recv вернет это самое "что-то".


    > 1)


    Ты обработку с выборкой не путаешь ?


    > 2)


    Никак.
    Да и нафих оно не нужно, потому что извращенная это логика.

    Но если изврат твоя стихия, то можно извлекать из очереди сообщения, относящиеся только к твоим сокетам и тут же ставить их в хвост очереди сообщений безо всякой обработки.
  • SpellCaster (09.04.08 18:15) [28]
    > Чтение-то не из сокета происходит, а из внутреннего буфера
    > приема !
    > Если там что-то имеется на момент закрытия сокета, то recv
    > вернет это самое "что-то".

    Ну да. Но разве он не освобождается после закрытия? К тому же хэндл уэ точно не будет иметь смысла после Close.

    > Ты обработку с выборкой не путаешь ?

    Угу... есть такое дело. Так как сделать это в отдельном потоке? Или там нужно будет PostThreadMessage юзать?
  • Сергей М, (09.04.08 20:31) [29]

    > разве он не освобождается после закрытия?


    Смотря с какой стороны его закрыть.


    > как сделать это в отдельном потоке?


    Сделать что ?
    Выборку ?
    Обработку ?
    И то и другое ?
  • SpellCaster (10.04.08 12:59) [30]
    Выборку
  • Сергей М. © (10.04.08 14:19) [31]
    По умолчанию поток может выбирать сообщения только тем окнам, которые созданы в его собственном контексте.
  • SpellCaster (10.04.08 16:06) [32]
    Ну и...?
  • Сергей М. © (10.04.08 16:11) [33]
    Что "ну и" ?
  • SpellCaster (10.04.08 17:38) [34]
    В каком смысле > созданы в его собственном контексте.? Функция CreateЦindow была вызвана внутри Execute?
    И тогда если в том же Execute я организую выборку сообщений, то она будет распространяться только на эти окна?
  • SpellCaster (10.04.08 18:14) [35]
    Хотя мне все равно кажется, что это не выход... блин, ну как-то же делают серваки с сотнями клиентов, которые не тормозят... и этот ICS все хвалили, а там ведь такая же система
  • DiamondShark © (10.04.08 20:09) [36]

    > ну как-то же делают серваки с сотнями клиентов, которые
    > не тормозят

    Без окон


    > и этот ICS все хвалили

    ай да, конечно.
  • Сергей М, (10.04.08 20:19) [37]

    > В каком смысле > созданы в его собственном контексте.? Функция
    > CreateЦindow была вызвана внутри Execute?


    Да.
    Хотя каким боком к тебе этот Execute ?
    Ты вон все апями озабочен да BeginThread'ами)


    > если в том же Execute я организую выборку сообщений, то
    > она будет распространяться только на эти окна?


    По умолчанию - да.


    > как-то же делают серваки с сотнями клиентов, которые
    > не тормозят


    Их по-другому делают.
    Ты же не озаботился исследованием, ты сразу ринулся код лепить)
    Еще и оффтопом меня попрекнул)

    Чудо, блин)
  • SpellCaster (14.04.08 13:34) [38]
    > Без окон

    Может, есть и без окон, но большинтсво все-таки с гуем... виндоус все-таки. Ладно, уйдём от серваков. Возьмем "качалки" с кучей потоков загрузки - они-то не тормозят...

    > Ты вон все апями озабочен да BeginThread'ами)

    Вот не надо, треды через апи меня пока не привлекают)

    > Ты же не озаботился исследованием, ты сразу ринулся код
    > лепить)
    > Еще и оффтопом меня попрекнул)

    Гм. Исследованием чего?
    Ну а насчет оффа - все-таки речь не о соксах, согласись.
  • SpellCaster (14.04.08 13:36) [39]
    > Их по-другому делают

    Вот я и хочу узнать, какой там принцип юзается. С нитями понятно, хотя все равно не хочется с ними дело иметь - иначе смысл городить огород, легче все на синхронных оставить...
 
Конференция "Сети" » Асинхронные сокеты "забивают" очередь сообщений
Есть новые Нет новых   [134431   +14][b:0][p:0.001]