/usr/include/dlib/server/server_iostream.h is in libdlib-dev 18.18-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | // Copyright (C) 2006 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_SERVER_IOSTREAm_1_
#define DLIB_SERVER_IOSTREAm_1_
#include <iostream>
#include "server_iostream_abstract.h"
#include "../logger.h"
#include "../uintn.h"
#include "server_kernel.h"
#include "../sockstreambuf.h"
#include "../map.h"
namespace dlib
{
class server_iostream : public server
{
/*!
INITIAL VALUE
- next_id == 0
- con_map.size() == 0
CONVENTION
- next_id == the id of the next connection
- for all current connections
- con_map[id] == the connection object with the given id
- m == the mutex that protects the members of this object
!*/
typedef map<uint64,connection*,memory_manager<char>::kernel_2a>::kernel_1b id_map;
public:
server_iostream(
) :
next_id(0)
{}
~server_iostream(
)
{
server::clear();
}
protected:
void shutdown_connection (
uint64 id
)
{
auto_mutex M(m);
if (con_map.is_in_domain(id))
{
con_map[id]->shutdown();
}
}
private:
virtual void on_connect (
std::istream& in,
std::ostream& out,
const std::string& foreign_ip,
const std::string& local_ip,
unsigned short foreign_port,
unsigned short local_port,
uint64 connection_id
)=0;
void on_connect (
connection& con
)
{
bool my_fault = true;
uint64 this_con_id;
try
{
sockstreambuf buf(&con);
std::istream in(&buf);
std::ostream out(&buf);
in.tie(&out);
// add this connection to the con_map
{
auto_mutex M(m);
this_con_id = next_id;
connection* this_con = &con;
con_map.add(this_con_id,this_con);
this_con_id = next_id;
++next_id;
}
my_fault = false;
on_connect(
in,
out,
con.get_foreign_ip(),
con.get_local_ip(),
con.get_foreign_port(),
con.get_local_port(),
this_con_id
);
// remove this connection from the con_map
{
auto_mutex M(m);
connection* this_con;
uint64 junk;
con_map.remove(this_con_id,junk,this_con);
}
}
catch (std::bad_alloc&)
{
// make sure we remove this connection from the con_map
{
auto_mutex M(m);
if (con_map.is_in_domain(this_con_id))
{
connection* this_con;
uint64 junk;
con_map.remove(this_con_id,junk,this_con);
}
}
_dLog << LERROR << "We ran out of memory in server_iostream::on_connect()";
// if this is an escaped exception from on_connect then let it fly!
// Seriously though, this way it is obvious to the user that something bad happened
// since they probably won't have the dlib logger enabled.
if (!my_fault)
throw;
}
}
uint64 next_id;
id_map con_map;
const static logger _dLog;
mutex m;
};
}
#ifdef NO_MAKEFILE
#include "server_iostream.cpp"
#endif
#endif // DLIB_SERVER_IOSTREAm_1_
|