MyClass()
: m_IoService()
, m_Acceptor(m_IoService)
{
char address[] = "0.0.0.0";
char port[] = "6400";
boost::asio::ip::tcp::resolver resolver(m_IoService);
boost::system::error_code resultCode;
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve({ address, port }, resultCode);
if (resultCode)
{
}
m_Acceptor.open(endpoint.protocol(), resultcode);
if(resultCode)
{
}
m_Acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true), resultCode);
if (resultCode)
{
}
m_Acceptor.bind(endpoint, resultCode);
if (resultCode)
{
// Error here
}
}
在Address already in use
的Linux上,我从acceptor.bind中遇到了一个错误,但显然设置了reuse_address(true)
。在Windows上不会发生这种情况。我是否缺少其他选择?
请注意,这并非始终发生,但有时会发生。我认为这是在程序的最后一个进程/运行关闭时发生的,端口进入WAIT状态,然后如果该程序在该时间段内再次运行,它将无法按我的意愿重复使用该端口。但是,如果经过了足够的时间,或者端口已安全关闭,这不是问题。 Windows永远不会出现此问题。
此SO似乎表明平台之间存在差异,但并未说明如何使Linux重用端口:BOOST ASIO: Why don't I get "bind: Address already in use" in Windows (but do get it in Linux)?