嗨,我的代碼在 Windows 上可以正常作業,但在 linux 上,重新連接功能不起作用,它會引發例外WSAEADDRINUSE值。
pClientSocket = new tcp::socket(*pIO_context, tcp::endpoint(boost::asio::ip::make_address(127.0.0.1, 50001));
第一次它在 Windows 和 Linux 上都可以作業,但是當我關閉套接字并嘗試再次連接時,我遇到了如上所述的例外,僅在 linux 作業系統上。
這是關閉套接字代碼。
boost::system::error_code ec;
pClientSocket->shutdown( boost::asio::socket_base::shutdown_type::shutdown_receive, ec);
pClientSocket->close(eCode);
delete pClientSocket;
pClientSocket= nullptr;
uj5u.com熱心網友回復:
嘗試使用重用選項:
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
更新:
這通常發生在我們嘗試將服務器套接字系結到已經在使用或最近使用過的地址上(并且套接字仍在等待作業系統清理)。
對于客戶端套接字,這種情況不太常見,您必須通過在套接字中呼叫 bind() 來強制埠才能發生這種情況。
現在代碼:
pClientSocket = new tcp::socket(*pIO_context, tcp::endpoint(boost::asio::ip::make_address(127.0.0.1, 50001));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
呼叫此建構式多載。此建構式創建套接字并嘗試將其系結到指定地址。它失敗是因為您沒有機會指定重用選項。
另一方面,這段代碼:
pClientSocket = new tcp::socket(*pIO_context);
pClientSocket->open(boost::asio::ip::tcp::v4());
pClientSocket->set_option(socket_base::reuse_address(true));
boost::system::error_code ec;
pClientSocket->bind(tcp::endpoint(make_address(127.0.0.1, 50001), ec);
if (ec) { }
呼叫這個建構式多載,它只創建套接字但不打開和連接它。這允許在系結/連接等之前指定任何套接字選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313390.html
