open_toontown_panda3d/panda/src/net/connectionManager.h

155 lines
5.5 KiB
C++

// Filename: connectionManager.h
// Created by: jns (07Feb00)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#ifndef CONNECTIONMANAGER_H
#define CONNECTIONMANAGER_H
#include "pandabase.h"
#include "netDatagram.h"
#include "connection.h"
#include "pointerTo.h"
#include "pset.h"
#include "pvector.h"
#include "lightMutex.h"
class NetAddress;
class ConnectionReader;
class ConnectionWriter;
////////////////////////////////////////////////////////////////////
// Class : ConnectionManager
// Description : The primary interface to the low-level networking
// layer in this package. A ConnectionManager is used
// to establish and destroy TCP and UDP connections.
// Communication on these connections, once established,
// is handled via ConnectionReader, ConnectionWriter,
// and ConnectionListener.
//
// You may use this class directly if you don't care
// about tracking which connections have been
// unexpectedly closed; otherwise, you should use
// QueuedConnectionManager to get reports about these
// events (or derive your own class to handle these
// events properly).
////////////////////////////////////////////////////////////////////
class EXPCL_PANDA_NET ConnectionManager {
PUBLISHED:
ConnectionManager();
virtual ~ConnectionManager();
PT(Connection) open_UDP_connection(int port = 0);
PT(Connection) open_UDP_connection(const string &hostname, int port, bool for_broadcast = false);
BLOCKING PT(Connection) open_TCP_server_rendezvous(int port, int backlog);
BLOCKING PT(Connection) open_TCP_server_rendezvous(const string &hostname,
int port, int backlog);
BLOCKING PT(Connection) open_TCP_server_rendezvous(const NetAddress &address,
int backlog);
BLOCKING PT(Connection) open_TCP_client_connection(const NetAddress &address,
int timeout_ms);
BLOCKING PT(Connection) open_TCP_client_connection(const string &hostname, int port,
int timeout_ms);
bool close_connection(const PT(Connection) &connection);
BLOCKING bool wait_for_readers(double timeout);
static string get_host_name();
class Interface {
PUBLISHED:
const string &get_name() const { return _name; }
const string &get_mac_address() const { return _mac_address; }
bool has_ip() const { return (_flags & F_has_ip) != 0; }
const NetAddress &get_ip() const { return _ip; }
bool has_netmask() const { return (_flags & F_has_netmask) != 0; }
const NetAddress &get_netmask() const { return _netmask; }
bool has_broadcast() const { return (_flags & F_has_broadcast) != 0; }
const NetAddress &get_broadcast() const { return _broadcast; }
bool has_p2p() const { return (_flags & F_has_p2p) != 0; }
const NetAddress &get_p2p() const { return _p2p; }
void output(ostream &out) const;
public:
Interface() { _flags = 0; }
void set_name(const string &name) { _name = name; }
void set_mac_address(const string &mac_address) { _mac_address = mac_address; }
void set_ip(const NetAddress &ip) { _ip = ip; _flags |= F_has_ip; }
void set_netmask(const NetAddress &ip) { _netmask = ip; _flags |= F_has_netmask; }
void set_broadcast(const NetAddress &ip) { _broadcast = ip; _flags |= F_has_broadcast; }
void set_p2p(const NetAddress &ip) { _p2p = ip; _flags |= F_has_p2p; }
private:
string _name;
string _mac_address;
NetAddress _ip;
NetAddress _netmask;
NetAddress _broadcast;
NetAddress _p2p;
int _flags;
enum Flags {
F_has_ip = 0x001,
F_has_netmask = 0x002,
F_has_broadcast = 0x004,
F_has_p2p = 0x008,
};
};
void scan_interfaces();
int get_num_interfaces();
const Interface &get_interface(int n);
MAKE_SEQ(get_interfaces, get_num_interfaces, get_interface);
protected:
void new_connection(const PT(Connection) &connection);
virtual void flush_read_connection(Connection *connection);
virtual void connection_reset(const PT(Connection) &connection,
bool okflag);
void add_reader(ConnectionReader *reader);
void remove_reader(ConnectionReader *reader);
void add_writer(ConnectionWriter *writer);
void remove_writer(ConnectionWriter *writer);
string format_mac_address(const unsigned char *data, int data_size);
typedef phash_set< PT(Connection) > Connections;
typedef phash_set<ConnectionReader *, pointer_hash> Readers;
typedef phash_set<ConnectionWriter *, pointer_hash> Writers;
Connections _connections;
Readers _readers;
Writers _writers;
LightMutex _set_mutex;
typedef pvector<Interface> Interfaces;
Interfaces _interfaces;
bool _interfaces_scanned;
private:
friend class ConnectionReader;
friend class ConnectionWriter;
friend class ConnectionListener;
friend class Connection;
};
INLINE ostream &operator << (ostream &out, const ConnectionManager::Interface &iface) {
iface.output(out);
return out;
}
#endif