Синопсис:
Моя программа иногда сталкивается с состоянием, когда она хочет отправить данные через сокет, но этот сокет блокируется в ожидании ответа на предыдущую команду, которая так и не пришла. Есть ли способ разблокировать сокет и вернуться к нему, когда это произойдет? Если нет, то как я могу проверить, заблокирован ли сокет, чтобы я мог закрыть его и открыть новый? (Мне нужны блокирующие розетки в первую очередь)
Подробнее:
Я подключаюсь к серверу через два сокета. Разъем 1 предназначен для общего командного взаимодействия. Сокет 2 предназначен для отмены запущенных команд. Прекращение может произойти в любое время и часто. Каждая команда, отправленная через сокет 1, получает ответ, такой как:
socket1 send: set command data
socket1 read: set command ack
Между отправкой и чтением всегда есть некоторое время, поскольку сервер ничего не отправляет обратно, пока команда не завершит выполнение.
Для прерывания выполняющихся команд я подключаюсь через другой сокет и выдаю команду прерывания. Затем я использую сокет 1 для выдачи новой команды.
Я обнаружил, что иногда команды, выдаваемые через сокет 1 после прерывания, зависают в программе. Похоже, сокет 1 заблокирован в ожидании ответа на ранее выполненную команду, которая никогда не возвращалась (и была прервана). Хотя обычно это работает, иногда нет (я не писал сервер).
В этих случаях могу ли я проверить, не заблокирован ли сокет 1 в ожидании чтения, и если да, отказаться от чтения и продолжить? Или вообще любой способ проверить, чтобы я мог закрыть эту розетку и начать заново?
ТНХ!
ОБНОВЛЕНИЕ 1: спасибо за ответы. Что касается того, почему я использую блокирующие сокеты, то это потому, что я управляю станком с ЧПУ с помощью этого кода, и мне нужно знать, когда выполнялась команда, которую я попросил выполнить. Сервер возвращает ACK, когда это сделано, так что это кажется хорошим способом справиться с этим. Мне нравится идея рефакторинга для неблокирования, но я не могу представить способ получения информации, когда команда выполняется иначе. Я посмотрю на выбор и другие варианты.