Я пишу приложение на C ++ с использованием Embarcadero RAD studio и TServerSocket
компонент в режиме блокировки. Я переопределил OnGetThread
обработчик для сокета для создания пользовательского класса, производного от TServerClientThread
который отменяет значение по умолчанию ClientExecute()
метод. В рамках этой функции я использую TWinSocketStream
и звонить WaitForData()
, Read()
, а также Write()
получать и отправлять данные. Судя по всему, что я прочитал, это приемлемый способ решения проблем (хотя, пожалуйста, исправьте меня, если это не так).
Из этого ответа Какие события запускаются для блокирующего сокета? Я склонен полагать, что с помощью OnClientError
обработчик в режиме блокировки в порядке, так как события будут срабатывать. В моем обработчике событий я каждый раз устанавливаю код ошибки на ноль, чтобы исключение не генерировалось.
Кроме того, каждый раз, когда я звоню Read()
или же Write()
изнутри моего ClientExecute()
Функция я обернуть его в блок try-catch и поймать ESocketError
исключения.
Мой вопрос таков: какой подход лучше?
Это старый компонент, и он устарел, но я должен его использовать, но так как я не смог найти руководство по правильному использованию чугуна, я собрал воедино подход из многих источников. Это работало хорошо в течение достаточно долгого времени, но время от времени я получаю тихую ошибку, которая не позволяет серверу принимать любые дальнейшие клиентские подключения — но я не получаю вывод от OnClientError
и нет ESocketErrors
брошены. Это приложение работает на встроенном устройстве, поэтому его можно обнаружить только в том случае, если оно перестает отвечать на запросы.
Если бы кто-нибудь мог дать мне совет о том, какой из трех подходов выше (или предложить альтернативу), я был бы очень благодарен.
Если TServerSocket
больше не принимает новые соединения, то либо его внутренние TServerAcceptThread
нить разбилась так TServerWinSocket.Accept()
больше не вызывается или Accept()
вызывается, но сталкивается с ошибками ОС (нехватка системных ресурсов и т. д.). В любом случае, TServerSocket
не раскрывает какую-либо информацию об ошибках из этих конкретных областей своего кода, поэтому у вас нет возможности обнаруживать и обрабатывать, когда ваш сервер прекращает принимать соединения, если ваши соединения не достаточно часты, чтобы вы могли использовать таймер для обнаружения длительных периодов бездействия между OnClientConnect
События. Если вы подозреваете, что ваш сервер перешел в непринятое состояние, все, что вы можете сделать, это закрыть приложение и снова открыть TServerSocket
,
Других решений пока нет …