На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > ::connect
      Однопоточный сервер ждет подключений и при коннекте обрабатывает его.
      Если в момент обработки происходит попытка еще одного подключения, то оно виснет на connect и ждет, пока
      первый отключится.

      Можно ли сделать так, чтоб второе подключение в этот момент завершалось ошибкой ?

      З.Ы. Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил?
        Цитата zss @
        Можно ли сделать так, чтоб второе подключение в этот момент завершалось ошибкой ?
        Закрыть слушающий сокет сразу же после accept, и открывать его заново только после отключения клиента.

        Цитата zss @
        Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил?
        проверка идентификации? Имешь ввиду аутентификацию? Ибо в процессе идентификации по определению нечего проверять (кроме различных ошибок передачи данных).
          Цитата zss @
          З.Ы. Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил?

          Можно не принимать какое-то соединение - на базе функции WSAAccept():

          Функция при определенных условиях принимает на обработку запрос из очереди установленных соединений, обеспечивает спецификации качества обслуживания QOS и позволяет передачу данных соединения. Возвращает значение типа SOCKET для присоединенного сокета, при ошибке - INVALID_SOCKET.
          ExpandedWrap disabled
            SOCKET WSAAPI  WSAAccept (
            IN  SOCKET          sd,
            OUT struct sockaddr FAR *   addr,
            IN OUT  LPINT               addrlen,
            IN  LPCONDITIONPROC         lpfnCondition,
            IN  DWORD               dwCallbackData);

          Здесь:
          · addr - необязательный указатель на буфер (структуру), где должен храниться адрес подключаемого объекта; формат адреса определяется типом протокола, заданным при создании сокета;
          · addrlen - необязательный указатель на целую переменную, которая определяет длину аргумента addr;
          · lpfnCondition - адрес необязательный процедуры, которая на основе анализа некоторых условий (например, нежелательный IP-адрес) возвращает CF_ACCEPT для приема, CF_REJECT для отказа обслуживания запроса или CF_DEFER для отложенного анализа. На основе анализа возврата WSAAccept() принимает решение о дальнейшей обработке, или о создании группы сокетов, или подключает сокет к уже существующей группе. Например, надо отказаться от обслуживания запроса. Функция анализа возвращает CF_REJECT и WSAAccept() в свою очередь возвращает INVALID_SOCKET с кодом ошибки WSAECONNREFUSED. Режим вызова процедуры, адресованной lpfnCondition, осуществляется установкой опции прослушивающего сокета SO_CONDITIONAL_ACCEPT (тип - BOOL). Использование этого режима снижает нагрузку на сеть и повышает устойчивость сервера против атак.
          · DwCallbackData - параметр, возвращаемый приложению. Этот параметр не интерпретируется WinSock.
          Процедура условия (condition procedure) имеет следующий прототип:
          ExpandedWrap disabled
            int CALLBACK ConditionFunc(
            IN          LPWSABUF        lpCallerId,
            IN          LPWSABUF        lpCallerData,
            IN OUT          LPQOS           lpSQOS,
            IN OUT          LPQOS           lpGQOS,
            IN          LPWSABUF        lpCalleeId,
            OUT         LPWSABUF        lpCalleeData,
            OUT         GROUP FAR *     g,  
            IN          DWORD           dwCallbackData
             );

          и описывается как функция обратного вызова. Эта функция фактически только резервирует место для имени функции приложения, реализация которой должна находиться в некоторой DLL или в модуле приложения и адресоваться с помощью функции MakeProcInstance().

          Иных способов идентификации при коннекте в протоколе TCP увы пока нет - но в принципе над этим работают - так наз. Connect Data c проверкой lpCalleeData
            Цитата albom @
            Закрыть слушающий сокет сразу же после accept, и открывать его заново только после отключения клиента.

            не покатит, т.к. до нового accept дело не дойдет. Это один поток. Может какие опции есть ?


            Цитата albom @
            проверка идентификации? Имешь ввиду аутентификацию? Ибо в процессе идентификации по определению нечего проверять (кроме различных ошибок передачи данных).

            нет - именно идентификация. Аутентификация, на сколько я понимаю, логин-пароль. А мне нужна проверка некоего условия


            Цитата Oleg2004 @
            Можно не принимать какое-то соединение - на базе:
            4.1.2. Функция WSAAccept()

            спасибо - подробное описание. Только чтоб не переделывать код (я использую ::accept) нельзя извратиться ? или только WSA?

            Добавлено
            Цитата Oleg2004 @
            принимает решение о дальнейшей обработке, или о создании группы сокетов, или подключает сокет к уже существующей группе

            а что дают эти группы ?

            Добавлено
            Цитата Oleg2004 @
            реализация которой должна находиться в некоторой DLL или в модуле приложения и адресоваться с помощью функции MakeProcInstance().

            а просто функция не покатит ?
            Сообщение отредактировано: zss -
              Цитата zss @
              спасибо - подробное описание. Только чтоб не переделывать код (я использую ::accept) нельзя извратиться ? или только WSA?

              Наверно только WSA - других вариантов я не вижу.

              Цитата zss @
              а что дают эти группы ?

              Пока - ничего :D
              Идеология - есть - реализации - пока никакой :)
              Цитата zss @
              а просто функция не покатит ?

              Гляньте в MSDN - может мелкософт еще что предлагает сейчас
                Цитата Oleg2004 @
                Пока - ничего :D
                Идеология - есть - реализации - пока никакой :)

                :)


                Цитата Oleg2004 @
                Гляньте в MSDN - может мелкософт еще что предлагает сейчас

                вроде функция прокатила. Единственное, что осталось - идентификация.

                Проблема в том, что клиент должен послать некие данные, а сервер их проверить.
                1. Можно ли в ConditionFunc получить данные
                2. Как заставить клиента при коннекте слать эти данные.

                З.Ы, Не хотелось бы это делать после подключения простой пересылкой данных (recv/send). Хотелось бы это реализовать на этапе подключения.
                  Цитата zss @
                  Проблема в том, что клиент должен послать некие данные, а сервер их проверить.
                  1. Можно ли в ConditionFunc получить данные
                  2. Как заставить клиента при коннекте слать эти данные.

                  З.Ы, Не хотелось бы это делать после подключения простой пересылкой данных (recv/send). Хотелось бы это реализовать на этапе подключения.

                  Увы, пока это напрямую невозможно
                  4.1.3. Функция WSAConnect()
                  Модификация функции Беркли connect() с асинхронным исполнением. Устанавливает соединение с адресатом, обменивается данными о соединении (если протокол поддерживает такие данные), определяет требования по качеству обслуживания – если они есть. Возвращает ноль при успехе и SOCKET_ERROR при ошибке.
                  ExpandedWrap disabled
                    int WSAAPI WSAConnect (
                    IN      SOCKET              sd,
                    IN      const struct sockaddr FAR *     name,
                    IN      int                     namelen,
                    IN      LPWSABUF                lpCallerData,
                    OUT     LPWSABUF                lpCalleeData,
                    IN      LPQOS                   lpSQOS,
                    IN      LPQOS                   lpGQOS
                    );

                  Здесь:
                  · sd - дескриптор несоединенного сокета.
                  · name - указатель на адресную структуру сокета адресата.
                  · namelen - длина адреса сокета.
                  · LpCallerData - указатель на пользовательские данные, которые надо передать партнеру во время установления соединения (если поддерживается протоколом).
                  · LpCalleeData - указатель на пользовательские данные, которые должны быть переданы от партнера во время установления соединения (если поддерживается протоколом).
                  Примечание
                  Пользовательские данные при соединении поддерживаются только для ATM-сетей (RAWWAN) для простых сокетов. Стек TCP/IP в Windows не поддерживает данные соединения.
                  · LpSQOS – указатель на характеристики потока для данного сокета.
                  · LpGQOS – зарезервировано для будущего использования с группами сокетов.
                    жаль :(

                    Добавлено
                    но все-равно спасибо...
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0398 ]   [ 16 queries used ]   [ Generated: 27.04.24, 20:00 GMT ]