const BoolTrue:LongBool=true;
...
SetSockOpt(ServerSocket,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,@BoolTrue,SizeOf(BoolTrue));
Win sockets: как узнать, что сервер отклонил попытку соединения WSAConnect
на сервере вызываем listen, затем WSAAccept. в качестве CONDITIONPROC задаем ф-ию, которая 2 раза возвращает CF_ACCEPT, а на все последующие попытки подключения - CF_REJECT.
со стороны клиента вызываем WSAConnect. Проблема в том, что WSAConnect всегда будет возвращать 0 (подключение успешно), даже если вызывать ее 10 раз.
Как при выове WSAConnect узнать, отклонил ли сервер подключение?
Хотя судя по поведению сокета, после WSAConnect подключение действительно установлено, ф-ия send возвращает количество посланных байт. Токда как правильно отклонить подключение на сервере?
Цитата:
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.
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.
Цитата:
WSAConnect всегда будет возвращать 0 (подключение успешно), даже если вызывать ее 10 раз.
Цитата:
после WSAConnect подключение действительно установлено, ф-ия send возвращает количество посланных байт.
Соответственно WSAConnect возвращает 0, select говорит, что сокет готов к отправке данных, WSAEventSelect взводит флаг об успешном подключении и т.д.
И все это происходит независимо от того accepted или rejected было на другом конце - на сервере
Код:
то результат connect'а клиента будет SOCKET_ERROR, а WSAGetLastError даст WSAECONNREFUSED.
Цитата: Somebody
Если для сокета сервера установить опцию SO_CONDITIONAL_ACCEPT:
то результат connect'а клиента будет SOCKET_ERROR, а WSAGetLastError даст WSAECONNREFUSED.
Код:
const BoolTrue:LongBool=true;
...
SetSockOpt(ServerSocket,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,@BoolTrue,SizeOf(BoolTrue));
...
SetSockOpt(ServerSocket,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,@BoolTrue,SizeOf(BoolTrue));
то результат connect'а клиента будет SOCKET_ERROR, а WSAGetLastError даст WSAECONNREFUSED.
Отлично, это сработало, то что надо ;)
спасибо