I have a server where there must be
only one instance of it for a given machine on a given port number. Here
is the code I used to try to make that happen:
boost::asio::io_service ios;
boost::asio::ip::tcp::endpoint primaryEndpoint(boost::asio::ip::tcp::v4(),
primaryPort);
std::auto_ptr<boost::asio::ip::tcp::acceptor>
primaryAcceptor;
try
{
primaryAcceptor.reset(new boost::asio::ip::tcp::acceptor(ios,
primaryEndpoint));
primaryAcceptor->open(primaryEndpoint.protocol());
primaryAcceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
primaryAcceptor->bind(primaryEndpoint);
}
catch(std::exception& ex)
{
std::cout << "Error: Cannot
obtain port " << primaryPort
<< ", " << ex.what()
<< ", server must be already running." << std::endl;
}
It always prints the error. The error
is 'Already open'. The exception gets thrown from the call to open. What
am I doing wrong please? If don't do the open etc then I can run up a second
instance and it will have the port also. It is as if SO_REUSEADDR is true.
I always thought that SO_REUSEADDR was false by default. When I run it
in the debugger and breakpoint before the call to open , the process has
the port open for listening, as revealed by 'netstat -a'. It is as
if it has already done the open with SO_REUSEADDR set to true.
I am using boost version 1.42.0 on Windoze-XP
compiled with Visual Studio 2005 (don't laugh....).
Regards,
Andrew Marlow
___________________________________________________________
This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is prohibited.
Please refer to http://www.bnpparibas.co.uk/en/information/legal_information.asp?Code=ECAS-845C5H for additional disclosures.