Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Win sockets: как узнать, что сервер отклонил попытку соединения WSAConnect

401
27 сентября 2007 года
Br@in RIPper
289 / / 15.02.2003
Необходимо разрешить серверу принимать только ограниченное число соединений, например только 2.

на сервере вызываем listen, затем WSAAccept. в качестве CONDITIONPROC задаем ф-ию, которая 2 раза возвращает CF_ACCEPT, а на все последующие попытки подключения - CF_REJECT.

со стороны клиента вызываем WSAConnect. Проблема в том, что WSAConnect всегда будет возвращать 0 (подключение успешно), даже если вызывать ее 10 раз.
Как при выове WSAConnect узнать, отклонил ли сервер подключение?

Хотя судя по поведению сокета, после WSAConnect подключение действительно установлено, ф-ия send возвращает количество посланных байт. Токда как правильно отклонить подключение на сервере?
353
28 сентября 2007 года
Nixus
840 / / 04.01.2007
Из msdn:
Цитата:
If no error occurs, WSAConnect returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code may be retrieved by calling WSAGetLastError. On a blocking socket, the return value indicates success or failure of the connection attempt.
With a nonblocking socket, the connection attempt may not be completed immediately. In this case, WSAConnect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. In this case, the application may:
1. Use select to determine the completion of the connection request by checking if the socket is writeable, or
2. If your application is using WSAAsyncSelect to indicate interest in connection events, then your application will receive an FD_CONNECT notification when the connect operation is complete, or
3. If your application is using WSAEventSelect to indicate interest in connection events, then the associated event object will be signaled when the connect operation is complete.

401
28 сентября 2007 года
Br@in RIPper
289 / / 15.02.2003
Из предыдущего поста:
Цитата:
WSAConnect всегда будет возвращать 0 (подключение успешно), даже если вызывать ее 10 раз.



Цитата:
после WSAConnect подключение действительно установлено, ф-ия send возвращает количество посланных байт.



Соответственно WSAConnect возвращает 0, select говорит, что сокет готов к отправке данных, WSAEventSelect взводит флаг об успешном подключении и т.д.
И все это происходит независимо от того accepted или rejected было на другом конце - на сервере

5.3K
01 октября 2007 года
Somebody
185 / / 24.12.2006
Если для сокета сервера установить опцию SO_CONDITIONAL_ACCEPT:
 
Код:
const BoolTrue:LongBool=true;
...
SetSockOpt(ServerSocket,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,@BoolTrue,SizeOf(BoolTrue));

то результат connect'а клиента будет SOCKET_ERROR, а WSAGetLastError даст WSAECONNREFUSED.
401
01 октября 2007 года
Br@in RIPper
289 / / 15.02.2003
Цитата: Somebody
Если для сокета сервера установить опцию SO_CONDITIONAL_ACCEPT:
 
Код:
const BoolTrue:LongBool=true;
...
SetSockOpt(ServerSocket,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,@BoolTrue,SizeOf(BoolTrue));

то результат connect'а клиента будет SOCKET_ERROR, а WSAGetLastError даст WSAECONNREFUSED.



Отлично, это сработало, то что надо ;)
спасибо

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог