У меня проблема со странной ошибкой в boost :: asio. Я реализую половину сервера TFTP (только сервер -> клиент). Я получаю первый пакет RRQ на порту 69 первого сокета, а затем создаю другой сокет для обмена данными DATA, ACK. Я запускаю async_receive () на этом сокете, а затем выполняю send () первого пакета данных. Затем я получаю обратный вызов обработчика для получения (я предполагаю, что поступает ACK), и он выдает ошибку «Невозможно установить соединение, потому что целевая машина активно отказала в этом», что, как я понимаю, из другого потока здесь означает ERROR_PORT_UNREACHABLE.
Я действительно не понимаю, как приемный вызов может вызвать НЕПРАВИЛЬНУЮ ошибку, так как я не обращаюсь ни к чему, я получаю. Я проверил результат send () и там нет ошибок.
Я проверил локальные и удаленные конечные точки в сокете (до и после ошибки), и у них есть правильный IP-адрес и порт для обоих.
Есть идеи? Я погуглил и не могу найти никого другого, у кого есть эта проблема. Большинство результатов привело меня к stackoverflow, поэтому я спрашиваю здесь.
РЕДАКТИРОВАТЬ —
Моя проблема была в том, что я использовал отладчик. К тому моменту, когда я приступил к отправке первого пакета данных, после того, как клиент отправил дюжину запросов примерно за секунду, клиент завершил работу и сдался, и мои данные опоздали. Когда я бегу без точек останова, все работает нормально. Спасибо всем за совет. Именно просмотр пакетов в Wireshark дал мне подсказку.
Причиной успешной отправки является то, что отправка просто указывает, что пакет передан ОС. В частности, ОС затем отправляет этот пакет адресату и отвечает IP-пакетом, указывающим, что хост не прослушивает. Ваша ОС затем получает его и устанавливает флаг на вашем сокете, который приводит к сбою следующего чтения. Так как вы уже выполняете асинхронный прием, он вызывает возврат ошибки.
Если возможно, я бы настоятельно рекомендовал использовать wireshark или что-то подобное, чтобы наблюдать за обменом UDP и посмотреть, сможете ли вы выявить любую другую проблему. Я не знаком с протоколом TFTP и не могу предоставить много информации там.
Других решений пока нет …