Я использую 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
производный класс вызывает некоторые проблемы?
OnClientConnect
событие вызвано TServerClientWinSocket
конструктор. TServerClientWinSocket
Объект строится сразу после OnGetSocket
событие вызывается, когда WinSock принимает новый клиентский сокет, и прямо перед OnAccept
а также OnGetThread
события называются. Так что единственный возможный способ, которым OnClientConnect
не будет вызван, если на самом деле вам не назначен обработчик.
OnClientError
вызывается во время неблокирующих сбоев сокета и TCustomWinSocket.SendStream()
, TCustomWinSocket.SendBuf()
, а также TCustomWinSocket.ReceiveBuf()
, Если вы используете TWinSocketStream
вместо этого для вашего ввода-вывода ни один из этих методов не вызывается им. Это поднимает ESocketError
исключения по неудаче вместо. Если вы не поймаете эти исключения, вызывающий TServerClientThread
будет просто завершать себя (после передачи исключения в основной поток для обработки).
Других решений пока нет …