5

Boost.Asioで2つのエラーに苦しんでいます。

1つ目は、ソケットでデータを受信しようとしたときに発生します。

char reply[1024];
boost::system::error_code error;
size_t reply_length = s.receive(boost::asio::buffer(reply, 1024), 0, error);
if (error) cout << error.message() << endl; //outputs "End of file"

2つ目は、(有効な!)ネイティブソケットからip :: tcp::socketを作成しようとしたときに発生します。

boost::asio::io_service ioserv;
boost::asio::ip::tcp::socket s(ioserv);

boost::system::error_code error;
s.assign(boost::asio::ip::tcp::v4(), nativeSocket, error);
if (error) cout << error.message() << endl; //outputs "The parameter is incorrect"

これらすべての問題があり、ドキュメントを参照する必要がないため、BSDソケットに戻りたくなりますが、そこでは自分自身の問題が発生しています...誰かが助けてくれるなら、本当に感謝しています。

編集:番号2に関して、nativeSocketは次のように宣言されます:

SOCKET nativeSocket = INVALID_SOCKET;
nativeSocket = accept(svr_sock, (struct sockaddr*)&sin, &size);

その後、ソケットに対して他のいくつかの処理が行われます。つまり、ioctlsocketを使用して非ブロッキングとして設定し、SO_LINGERおよびSO_OOBINLINEにsetsockoptを使用します。

4

1 に答える 1

1

これは、決して2番目の問題に対する完全な解決策ではありません。生成されたエラーはすべてにマッピングする必要がありますが、にそのboost::system::error_codeようなものが見つからないためboost/system/error_code.hpp、正確に何を意味するのか途方に暮れています。

しかし、ブースト1.39のコードを調べた後、assign最終的にどちらかに渡されますdetail::reactive_socket_service< Protocol, Reactor >.assign(またはdetail::win_iocp_socket_service<Protocol>、Windowsを使用している場合)。次の2か所でのみエラーが発生する可能性がありますboost/asio/detail/reactive_socket_service.hpp

if (is_open(impl))
{
  ec = boost::asio::error::already_open;
  return ec;
}

また

if (int err = reactor_.register_descriptor(
      native_socket, impl.reactor_data_))
{
  ec = boost::system::error_code(err,
      boost::asio::error::get_system_category());
  return ec;
}

エラーは発生しないため、already_openエラーはコードの2番目のビットから発生する必要があります。ifdefリアクタータイプは、の/elifペアのシーケンスに由来し、使用可能な関数のうち、の関数boost/asio/stream_socket_service.hppのみがエラーをスローする可能性があります(もちろん、可能性もあります)。のエラーは、具体的には次の原因によるものです。register_descriptorepoll_reactordetail::win_iocp_socket_service<Protocol>.assignepoll_reactorsys/epoll.h

int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
if (result != 0)
  return errno;

Windowsの実装では、関連するコードは

if (iocp_service_.register_handle(native_socket.as_handle(), ec))
  return ec;

これがあなたのエラーの原因だと思いますが、正直なところ、この時点を過ぎてそれを追跡することはできません。

于 2009-11-11T19:44:52.540 に答える