У меня есть две тестовые программы (A и B), которые почти идентичны и используют один и тот же асинхронный код boost asio UDP.
Вот прием вызова:
_mSocket.async_receive_from(
boost::asio::buffer(_mRecvBuffer), _mReceiveEndpoint,
boost::bind(&UdpConnection::handle_receive, this,_mReceiveEndpoint,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
// _mReceiveEndpoint is known and good. the buffer is good too.
// вот обработчик
void handle_receive(const udp::endpoint recvFromEP, const boost::system::error_code& error,std::size_t bytesRecv/*bytes_transferred*/)
{
boost::shared_ptr<std::string> message(new std::string(_mRecvBuffer.c_array(),bytesRecv));
if (!error)
{
doSomeThingGood();
}
else {
cerr << "UDP Recv error : " << error << endl;
}
}
Итак, вот что происходит, все на локальном хосте.
Если я сначала запускаю программу «A», затем программа «B», «A» выдает ошибку UDP Recv: сервер: 10061. Программа «А» продолжает нормально отправлять сообщения, а программа «В» принимает их нормально.
Вы можете поменять местами «А» и «Б» в приведенном выше предложении, и это все равно верно.
ЕСЛИ я попытаюсь сбросить состояние плохого чтения, снова вызвав mSocket.async_receive_from, я получу ошибку 10054.
Я просмотрел эти ошибки в Интернете ..... не очень полезно.
У кого-нибудь есть идеи относительно того, что это значит, и как я могу восстановиться внутри программы, если это произойдет? Есть ли способ сбросить сокет?
Проверка работоспособности.... могут ли обе программы работать по петле только с двумя портами? A отправить = 20000, A получить = 20001 B отправить = 20001, B получить = 20000
TL; DR Похоже, что если я пытаюсь прослушать перед отправкой, я получаю сообщение об ошибке, и я не могу исправить это. Если я слушаю после отправки, я в порядке.
-- РЕДАКТИРОВАТЬ. Похоже, что система предотвращения вторжений McAfee делает мне что-то неприятное... Если я отлаживаю VS2010, я застреваю в их DLL.
Спасибо