Я хочу поговорить с сетевым принтером по TCP через порт 9100. Я хотел бы прочитать из сокета, чтобы увидеть, если принтер делает какое-либо начальное сообщение, отправить что-то для печати, а затем снова прочитать из сокета, чтобы увидеть, еслипринтер делает какой-либо ответ перед закрытием сокета.
Проблема в том, что принтер может что-то сказать или не сказать в начале и в конце сеанса.Итак, если я использую блокирующий сокет, то при начальном чтении он может просто зависнуть (или я могу рассчитывать на read (), возвращающее 0 байт в такой ситуации?), Если принтеру нечего сказать.
Правильный ли способ сделать это, чтобы использовать неблокирующий сокет и затем использовать тайм-аут, чтобы решить, когда прекратить чтение?Другими словами, чтобы сделать это:
(1) введите цикл чтения и прервите, если ничего не читается в течение 10 секунд
(2) отправьте данные для печати
(3) снова введите цикл чтения иперерыв, если ничего не читается в течение 10 секунд
Это кажется довольно хакерским, и это также раздражает, потому что заставляет пользователя задерживать 20 секунд.
То, как мойчтение кода теперь я прекращаю пытаться читать, как только получаю 0 байтов, прочитанных из сокета, но меня беспокоит то, что это может привести к зависанию сокета или преждевременному разрыву цикла чтения до того, как принтер получит возможностьнаписать сообщение.