2

Linux で必要に応じて動作するかなり大きなアプリケーションがあります。最近、VC2012 を使用して Windows 7 でコンパイルし、asio 1.52 をブーストしたところ、奇妙な問題が発生しました。

同じ UDP ソケットでのasync_receive_from後に が続くと、読み取り完了ハンドラが10061 で呼び出されます。async_send_toboost::system::error_code

ターゲット マシンがアクティブに拒否したため、接続できませんでした

送信先がローカル ホストの別のポートの場合。パケットが別のマシンに送信された場合、読み取り完了ハンドラーは呼び出されません。読み取り完了ハンドラーの後に、エラーなしで書き込み完了ハンドラーが呼び出されます。

次のコードは、問題を再現します。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>

using namespace std;
using namespace boost::asio;

void read_completion_handler(const boost::system::error_code& ec, std::size_t bytes_received)
{
  if (!ec)
    cout << "Received " << bytes_received << " successfully" << endl;
  else
    cout << "Error: " << ec.message() << endl;
}

void write_completion_handler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
  if (!ec)
    cout << "Wrote " << bytes_transferred << " successfully" << endl;
  else
    cout << "Error: " << ec.message() << endl;
}

int main(int argc, char** argv)
{
  enum
  {
    max_length = 1500,
    out_length = 100
  };
  // buffer for incoming data
  char data[max_length];
  // outgoing data
  char out_data[out_length];

  // sender endpoint
  ip::udp::endpoint sender_endpoint;
  // for sending packets: if this localhost, the error occurs
  ip::udp::endpoint destination(ip::address::from_string("127.0.0.1"), 5004);

  io_service ioService;
  ip::udp::socket socket(ioService, ip::udp::endpoint(ip::udp::v4(), 49170));

  socket.async_receive_from(
    buffer(data, max_length), sender_endpoint,
    boost::bind(&read_completion_handler, 
    boost::asio::placeholders::error,
    boost::asio::placeholders::bytes_transferred));

  socket.async_send_to( boost::asio::buffer(out_data, out_length),
    destination,
    boost::bind(&write_completion_handler,
    boost::asio::placeholders::error,
    boost::asio::placeholders::bytes_transferred));

  ioService.run();

  cout << "Done" << endl;
  return 0;
}

Linux では、これは決して問題ではありません。誰か説明がありますか?私の知る限り、同じソケットでの同時読み取りと書き込みは問題ないはずですか、それとも Windows ではそうではありませんか? localhost が宛先の場合、なぜ動作が変わるのですか?

4

3 に答える 3