Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.152.99] |
|
Сообщ.
#1
,
|
|
|
Однопоточный сервер ждет подключений и при коннекте обрабатывает его.
Если в момент обработки происходит попытка еще одного подключения, то оно виснет на connect и ждет, пока первый отключится. Можно ли сделать так, чтоб второе подключение в этот момент завершалось ошибкой ? З.Ы. Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил? |
Сообщ.
#2
,
|
|
|
Цитата zss @ Закрыть слушающий сокет сразу же после accept, и открывать его заново только после отключения клиента.Можно ли сделать так, чтоб второе подключение в этот момент завершалось ошибкой ? Цитата zss @ проверка идентификации? Имешь ввиду аутентификацию? Ибо в процессе идентификации по определению нечего проверять (кроме различных ошибок передачи данных). Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил? |
Сообщ.
#3
,
|
|
|
Цитата zss @ З.Ы. Можно ли как как сделать, чтоб в процессе коннекта происходила проверка идентификации и, если она не удачна, то коннект не проходил? Можно не принимать какое-то соединение - на базе функции WSAAccept(): Функция при определенных условиях принимает на обработку запрос из очереди установленных соединений, обеспечивает спецификации качества обслуживания QOS и позволяет передачу данных соединения. Возвращает значение типа SOCKET для присоединенного сокета, при ошибке - INVALID_SOCKET. 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) имеет следующий прототип: 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 |
Сообщ.
#4
,
|
|
|
Цитата albom @ Закрыть слушающий сокет сразу же после accept, и открывать его заново только после отключения клиента. не покатит, т.к. до нового accept дело не дойдет. Это один поток. Может какие опции есть ? Цитата albom @ проверка идентификации? Имешь ввиду аутентификацию? Ибо в процессе идентификации по определению нечего проверять (кроме различных ошибок передачи данных). нет - именно идентификация. Аутентификация, на сколько я понимаю, логин-пароль. А мне нужна проверка некоего условия Цитата Oleg2004 @ Можно не принимать какое-то соединение - на базе: 4.1.2. Функция WSAAccept() спасибо - подробное описание. Только чтоб не переделывать код (я использую ::accept) нельзя извратиться ? или только WSA? Добавлено Цитата Oleg2004 @ принимает решение о дальнейшей обработке, или о создании группы сокетов, или подключает сокет к уже существующей группе а что дают эти группы ? Добавлено Цитата Oleg2004 @ реализация которой должна находиться в некоторой DLL или в модуле приложения и адресоваться с помощью функции MakeProcInstance(). а просто функция не покатит ? |
Сообщ.
#5
,
|
|
|
Цитата zss @ спасибо - подробное описание. Только чтоб не переделывать код (я использую ::accept) нельзя извратиться ? или только WSA? Наверно только WSA - других вариантов я не вижу. Цитата zss @ а что дают эти группы ? Пока - ничего Идеология - есть - реализации - пока никакой Цитата zss @ а просто функция не покатит ? Гляньте в MSDN - может мелкософт еще что предлагает сейчас |
Сообщ.
#6
,
|
|
|
Цитата Oleg2004 @ Пока - ничего Идеология - есть - реализации - пока никакой Цитата Oleg2004 @ Гляньте в MSDN - может мелкософт еще что предлагает сейчас вроде функция прокатила. Единственное, что осталось - идентификация. Проблема в том, что клиент должен послать некие данные, а сервер их проверить. 1. Можно ли в ConditionFunc получить данные 2. Как заставить клиента при коннекте слать эти данные. З.Ы, Не хотелось бы это делать после подключения простой пересылкой данных (recv/send). Хотелось бы это реализовать на этапе подключения. |
Сообщ.
#7
,
|
|
|
Цитата zss @ Проблема в том, что клиент должен послать некие данные, а сервер их проверить. 1. Можно ли в ConditionFunc получить данные 2. Как заставить клиента при коннекте слать эти данные. З.Ы, Не хотелось бы это делать после подключения простой пересылкой данных (recv/send). Хотелось бы это реализовать на этапе подключения. Увы, пока это напрямую невозможно 4.1.3. Функция WSAConnect() Модификация функции Беркли connect() с асинхронным исполнением. Устанавливает соединение с адресатом, обменивается данными о соединении (если протокол поддерживает такие данные), определяет требования по качеству обслуживания – если они есть. Возвращает ноль при успехе и SOCKET_ERROR при ошибке. 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 – зарезервировано для будущего использования с группами сокетов. |
Сообщ.
#8
,
|
|
|
жаль
Добавлено но все-равно спасибо... |