Почему события OnClientConnect и OnClientError не запускаются для TServerSocket в режиме блокировки

Я использую Embarcadero RAD studio C ++ Builder XE для создания приложения C ++. Приложение использует динамически созданный TServerSocket компонент в режиме блокировки. Я создаю класс, полученный из TServerClientThread который обеспечивает обычай ClientExecute() метод. Этот класс создается через TServerSocket обработчик события OnGetThread который я реализовал. Я назначаю обработчики событий для OnAccept, OnClientConnect, OnClientDisconnect а также OnClientError, Внутри моего класса темы я использую TWinSocketStream класс для чтения и записи из сокета.

Я использую пользовательский письменный класс (производный от TComponent), который создает TServerSocket и обработчики событий, которые я назначаю, являются функциями-членами этого класса.

мой OnAccept а также OnClientDisconnect события происходят, но ни один из OnClientConnect а также OnClientError события происходят вечно. Это нормальное поведение для этого компонента? Все, что я прочитал об этом компоненте, предполагает, что ВСЕ события будут срабатывать TServerSocket в режиме блокировки и я просто не могу понять, почему эти события не сработают. Есть ли что-то еще, что я должен сделать, или эти события просто не работают в режиме блокировки? Возможно ли использование TServerSocket экземпляр как член другого TComponent производный класс вызывает некоторые проблемы?

0

Решение

OnClientConnect событие вызвано TServerClientWinSocket конструктор. TServerClientWinSocket Объект строится сразу после OnGetSocket событие вызывается, когда WinSock принимает новый клиентский сокет, и прямо перед OnAccept а также OnGetThread события называются. Так что единственный возможный способ, которым OnClientConnect не будет вызван, если на самом деле вам не назначен обработчик.

OnClientError вызывается во время неблокирующих сбоев сокета и TCustomWinSocket.SendStream(), TCustomWinSocket.SendBuf(), а также TCustomWinSocket.ReceiveBuf(), Если вы используете TWinSocketStream вместо этого для вашего ввода-вывода ни один из этих методов не вызывается им. Это поднимает ESocketError исключения по неудаче вместо. Если вы не поймаете эти исключения, вызывающий TServerClientThread будет просто завершать себя (после передачи исключения в основной поток для обработки).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]