BoostSocket/ServerExampleException and error handling not shown
socket_base::initialise();
typedef std::map<socket_base, boost::sockets::ip4::address> Clients; Clients clients;
ip4::address addr;
addr.port(3234);
addr.hostname("localhost");
ip4::tcp_protocol protocol;
socket_option_non_blocking non_block(true);
acceptor_socket listening_socket; listening_socket.open(protocol,addr,6);
boost::sockets::socket_set master_set; master_set.add(listening_socket.socket());
while (true)
{
boost::sockets::socket_set active_set;
active_set=master_set;
if (::select(active_set.width(),
active_set.fdset(),
0,
0,
0)==socket_error)
{
check_error();
return;
}
boost::sockets::socket_set::iterator
i=active_set.begin(),
i_end=active_set.end();
for (; i!=i_end; ++i)
{
if (*i==listening_socket.socket().socket())
{
while (true)
{
//! this is our acceptor socket
ip4::address client;
socket_base accepted_socket=listening_socket.accept(client);
if (accepted_socket.isValid())
{
accepted_socket.ioctl(non_block);
master_set.add(accepted_socket);
clients.insert(std::make_pair(accepted_socket, client));
}
else
break;
}
}
else
{
// these are our data sockets
socket_base data_socket(*i);
ip4::address& client=clients[data_socket];
boost::sockets::basic_socket_stream<char> ss(data_socket);
while (!ss.eof() && !ss.fail())
{
ss >> str;
if (!ss.fail())
BOOST_MESSAGE(str);
}
if (ss.eof())
{
master_set.remove(data_socket);
clients.erase(data_socket);
data_socket.close();
}
}
}
}