2014-01-31 2 views
0

У меня есть клиентское приложение, которое несколько раз посылает команды через соединение сокета с сервером и получает соответствующие ответы. В этом разъемном соединении установлен тайм-аут отправки/возврата.Отменить ответ на EAGAIN

Если сервер по какой-то причине не отвечает, клиент получает EAGAIN. В период ожидания я хочу, чтобы клиент проигнорировал этот ответ и отправил следующий запрос.

Однако в настоящее время, когда я игнорирую EAGAIN и отправляю следующий запрос, я получаю ответ от предыдущего запроса.

Каков наилучший способ игнорировать ответ на EAGAIN?

ответ

1

Вы не можете. Вы должны это прочитать. Механизм игнорирования байтов в потоке байтов TCP отсутствует.

+0

@Seymour Вы ошибаетесь. ОП спрашивает, как делать то, чего просто невозможно. Поэтому ответ должен сказать так. Критика или разъяснения не требуется. Если вы думаете, что знаете лучше, я предлагаю вам опубликовать свой ответ, чтобы мы могли комментировать, голосовать и т. Д. – EJP

1

EAGAIN может указывать истечение тайм-аута (вам также необходимо обрабатывать EWOULDBLOCK). Если вы используете TCP, вы должны указать , прежде чем вы сможете читать любые последующие данные. Если вы получите EAGAIN при чтении, вам необходимо выполнить одно и то же чтение снова, используя те же параметры. Просто потому, что сервер медленно реагирует (или сеть не дотягивает до ответа) не означает, что ответ не будет получен вообще, если соединение не будет закрыто/потеряно.

Если вы действительно хотите иметь возможность получать ответы не по порядку, вам необходимо разработать свой протокол связи, чтобы поддержать это в первую очередь. Дайте каждому запросу уникальный идентификатор, который отражается в его ответе. Отправьте запрос, но не ждите ответа. Это позволит клиенту одновременно выполнять несколько запросов в полете и разрешать серверу отправлять ответы в любом порядке. Клиент должен будет прочитать каждый ответ по мере его поступления (что означает, что вы должны делать чтение асинхронно, обычно используя отдельный поток или какой-либо другой механизм параллельной сигнализации) и сопоставлять идентификатор каждого ответа с его первоначальным запросом, чтобы вы знали, как тогда обрабатывать его.

+0

EAGAIN не может быть «ошибочным». На самом деле это говорит о том, что отклика потребовалось больше времени, чем период ожидания, что, в свою очередь, может предполагать, что тайм-аут слишком короткий. Он должен быть достаточно длинным, чтобы любое истечение срока действия указывало на подлинную проблему соединения. – EJP

Смежные вопросы