Конференция "Сети" » TSocketServer без формы [D7, Win2k]
 
  • DiamondShark © (03.10.07 15:20) [20]

    > неблокирующий сокет - зло

    Зло, бес с порно.
    Сокетные компоненты (по кр.м., в исполнении борманда) -- ещё большее зло.


    > Притчу про "всякий овощ .." помнишь ?)

    Это не овощ, это сорняк-мутант.
  • DVM © (03.10.07 15:38) [21]

    > > неблокирующий сокет - зло
    >
    > Зло, бес с порно.

    Почему зло?
  • DVM © (03.10.07 15:39) [22]
    И не надо путать неблокирущие и асинхронные сокеты. Это не одно и то же.
  • Сергей М. © (03.10.07 15:49) [23]

    > Сокетные компоненты (по кр.м., в исполнении борманда) --
    >  ещё большее зло


    "Вы не любите кошек ? Да вы просто не умеете их готовить !" (С)


    > это сорняк-мутант


    Ну да.

    А аргументы, конечно же, - "наследие царского режима")
  • DiamondShark © (03.10.07 17:25) [24]

    > DVM ©   (03.10.07 15:38) [21]
    > Почему зло?

    Потому что, как тут верно, но не полно вспомнили, "наследие царского режима".


    > DVM ©   (03.10.07 15:39) [22]
    > И не надо путать неблокирущие и асинхронные сокеты. Это
    > не одно и то же.

    Не напомнишь, кто, где и когда утверждал, что это одно и то же?


    > Сергей М. ©   (03.10.07 15:49) [23]
    > "Вы не любите кошек ? Да вы просто не умеете их готовить
    > !" (С)

    Я так понял, это был Аргумент?


    > А аргументы, конечно же, - "наследие царского режима")

    Не затруднит напомнить полную версию текста, откуда ты отквоченное выдрал?
    Как только сподобишься, получишь аргумент на "сорняк".
    А "мутант" -- так это борландовское исполнение обёртки, к которой две основные претензии:

    1. Мутное обращение с сущностями.
    Не вводится никакой новой абстракции. Нафига объектная обёртка? Ладно, допустим, для батонокидательства. Но экономия трудоёмкости мизерная, объём рукописного кода соизмерим с прямым использованием WS API.
    Смешиваются сущности. В блокирующем и неблокирующем режимах используются разные наборы методов (либо общие методы, но изобилующие if Block then ... else ...), это наводит на мысль о разных ветвях наследования.

    2. Сокрытая сложность и неочевидные требования к окружению.
    В неблокирующем режиме компоненты используют механизм оконных сообщений и, как следствие, требуют message pump. Эта зависимость от окружения не только не очевидна из публичного интерфейса классов, но даже не отражена в документации. Обнаружить эту особенность можно либо стукнувшись лбом (как в субже), либо зная детали реализации (тогда вопрос: нафиг нужны такие weak-incapsulated компоненты?).
  • DVM © (03.10.07 17:34) [25]

    > Потому что, как тут верно, но не полно вспомнили, "наследие
    > царского режима".

    Наследие это асинхронные сокеты на сообщениях, а не неблокирующие. А говорите, что не путаете. Неблокирующие сокеты ничем не хуже и не лучше блокирующих, были и есть и используются и в Unix и в Windows. А вот асинхронные сокеты на сообщениях - это изобретение MS для ранних версий Win (3.11), так как в них с многопоточностью было все не очень гладко.
  • DVM © (03.10.07 17:40) [26]
    Просто так сложилось, что в Windows асинхронные сокеты - это всегда неблокирующие сокеты, но неблокирующие сокеты - это не всегда асинхронные.
  • DiamondShark © (03.10.07 18:56) [27]

    > DVM ©   (03.10.07 17:34) [25] [26]

    Это всё понятно.
    Только вот в компонентах под "неблокирующими" подразумеваются именно асинхронные сокеты на сообщениях.


    > Просто так сложилось, что в Windows асинхронные сокеты -
    >  это всегда неблокирующие сокеты

    Ну, теперь уже не всегда. Есть ведь overlapped IO, что намного удобнее.
  • Slym © (04.10.07 04:51) [28]
    DiamondShark ©   (03.10.07 17:25) [24]
    Я для себя сделал BlockScktComp - взял стандартный ScktComp и вырезал от туда всю асинхронику
  • Evgeny V © (04.10.07 07:06) [29]

    > DiamondShark ©   (03.10.07 18:56) [27]


    > Ну, теперь уже не всегда. Есть ведь overlapped IO, что намного
    > удобнее.


    В Windows всегда.
    MSDN ioctlsocket


    > The WSAAsyncSelect and WSAEventSelect functions automatically
    > set a socket to nonblocking mode


    Оно и понятно, что сокет должен быть неблокирующим. Иначе как бы мы могли вызвав recv, потом в этом же потоке подождать события функцией   WSAWaitForMultipleEvents, ибо висели бы на вызове recv, если сокет блокирующий.
  • Evgeny V © (04.10.07 10:24) [30]

    > DiamondShark ©   (03.10.07 18:56) [27]


    Хотя извиняюсь, в

    > Evgeny V ©   (04.10.07 07:06) [29]

    я наврал. С оверлаппед сокетами все сложнее. Просто подзабыл что EventSelect и overlapped сокеты это разное:-)
  • VaRela (19.10.07 12:45) [31]
    Доброе время суток всем, борюсь со следующей проблемой:
    TServerSocket работает в блокирующем режиме, создал своего наследника для потока TServerClientThread. В ClientExecute вертится следующий цикл (прошу прощения что BCB):

    while (!Terminated && ClientSocket->Connected)
    {
    .....
    }

    Цикл работает отлично, но при отключении клиента НЕ ЗАВЕРШАЕТСЯ!, никак не соображу почему.
    Как можно узнать что клиент отключился?

    P.S. Клиент не мой, переписать не смогу, протокола не знаю. :-)
 
Конференция "Сети" » TSocketServer без формы [D7, Win2k]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]