aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeterminant <[email protected]>2018-07-18 20:13:50 -0400
committerDeterminant <[email protected]>2018-07-18 20:13:50 -0400
commita75778995a4e0742f244670e9cc02a56611ccfe0 (patch)
tree7c4bda5e75cd957ab94b099872adeee3e4c724bc
parent12bf781e762705f2bbabe5102148ac699e20ef12 (diff)
improve network interface
-rw-r--r--include/salticidae/conn.h2
-rw-r--r--include/salticidae/network.h56
-rw-r--r--src/conn.cpp2
3 files changed, 44 insertions, 16 deletions
diff --git a/include/salticidae/conn.h b/include/salticidae/conn.h
index 4db5f40..0cb721e 100644
--- a/include/salticidae/conn.h
+++ b/include/salticidae/conn.h
@@ -263,7 +263,7 @@ class ConnPool {
/** create an active mode connection to addr */
conn_t create_conn(const NetAddr &addr);
/** setup and start listening */
- void init(NetAddr listen_addr);
+ void listen(NetAddr listen_addr);
};
}
diff --git a/include/salticidae/network.h b/include/salticidae/network.h
index 04679dd..93b5766 100644
--- a/include/salticidae/network.h
+++ b/include/salticidae/network.h
@@ -83,21 +83,32 @@ class MsgNetwork: public ConnPool {
protected:
mutable msg_stat_by_opcode_t sent_by_opcode;
mutable msg_stat_by_opcode_t recv_by_opcode;
- uint16_t listen_port;
ConnPool::conn_t create_conn() override { return (new Conn(this))->self(); }
public:
- MsgNetwork(const EventContext &eb): ConnPool(eb) {}
+ MsgNetwork(const EventContext &eb,
+ int max_listen_backlog,
+ double try_conn_delay,
+ double conn_server_timeout,
+ size_t seg_buff_size):
+ ConnPool(eb, max_listen_backlog,
+ try_conn_delay,
+ conn_server_timeout,
+ seg_buff_size) {}
+
void reg_handler(typename MsgType::opcode_t opcode, msg_callback_t handler);
void send_msg(const MsgType &msg, conn_t conn);
- void init(NetAddr listen_addr);
+ using ConnPool::listen;
msg_stat_by_opcode_t &get_sent_by_opcode() const {
return sent_by_opcode;
}
msg_stat_by_opcode_t &get_recv_by_opcode() const {
return recv_by_opcode;
}
+ conn_t create_conn(const NetAddr &addr) {
+ return static_pointer_cast<Conn>(ConnPool::create_conn(addr));
+ }
};
/** Simple network that handles client-server requests. */
@@ -120,12 +131,24 @@ class ClientNetwork: public MsgNetwork<MsgType> {
void on_teardown() override;
};
+ using conn_t = RcObj<Conn>;
+
protected:
ConnPool::conn_t create_conn() override { return (new Conn(this))->self(); }
public:
- ClientNetwork(const EventContext &eb): MsgNet(eb) {}
+ ClientNetwork(const EventContext &eb,
+ int max_listen_backlog = 10,
+ double try_conn_delay = 0,
+ double conn_server_timeout = 0,
+ size_t seg_buff_size = 4096):
+ MsgNet(eb, max_listen_backlog,
+ try_conn_delay,
+ conn_server_timeout,
+ seg_buff_size) {}
+
void send_msg(const MsgType &msg, const NetAddr &addr);
+ conn_t create_conn(const NetAddr &addr) = delete;
};
class PeerNetworkError: public SalticidaeError {
@@ -205,6 +228,7 @@ class PeerNetwork: public MsgNetwork<MsgType> {
IdentityMode id_mode;
double ping_period;
double conn_timeout;
+ uint16_t listen_port;
void msg_ping(const MsgType &msg, ConnPool::conn_t conn);
void msg_pong(const MsgType &msg, ConnPool::conn_t conn);
@@ -217,10 +241,17 @@ class PeerNetwork: public MsgNetwork<MsgType> {
public:
PeerNetwork(const EventContext &eb,
+ int max_listen_backlog = 10,
+ double try_conn_delay = 2,
+ double conn_server_timeout = 2,
+ size_t seg_buff_size = 4096,
double ping_period = 30,
double conn_timeout = 180,
IdentityMode id_mode = IP_PORT_BASED):
- MsgNet(eb),
+ MsgNet(eb, max_listen_backlog,
+ try_conn_delay,
+ conn_server_timeout,
+ seg_buff_size),
id_mode(id_mode),
ping_period(ping_period),
conn_timeout(conn_timeout) {}
@@ -229,10 +260,12 @@ class PeerNetwork: public MsgNetwork<MsgType> {
const conn_t get_peer_conn(const NetAddr &paddr) const;
void send_msg(const MsgType &msg, const Peer *peer);
void send_msg(const MsgType &msg, const NetAddr &paddr);
- void init(NetAddr listen_addr);
+ void listen(NetAddr listen_addr);
bool has_peer(const NetAddr &paddr) const;
const std::vector<NetAddr> &all_peers() const;
- using ConnPool::create_conn;
+ conn_t create_conn(const NetAddr &addr) {
+ return static_pointer_cast<Conn>(ConnPool::create_conn(addr));
+ }
};
template<typename MsgType>
@@ -390,14 +423,9 @@ void PeerNetwork<MsgType>::msg_pong(const MsgType &msg, ConnPool::conn_t conn_)
}
template<typename MsgType>
-void MsgNetwork<MsgType>::init(NetAddr listen_addr) {
+void PeerNetwork<MsgType>::listen(NetAddr listen_addr) {
+ MsgNet::listen(listen_addr);
listen_port = listen_addr.port;
- ConnPool::init(listen_addr);
-}
-
-template<typename MsgType>
-void PeerNetwork<MsgType>::init(NetAddr listen_addr) {
- MsgNet::init(listen_addr);
this->reg_handler(MsgType::OPCODE_PING,
std::bind(&PeerNetwork::msg_ping, this, _1, _2));
this->reg_handler(MsgType::OPCODE_PONG,
diff --git a/src/conn.cpp b/src/conn.cpp
index 62cba8a..052f2ad 100644
--- a/src/conn.cpp
+++ b/src/conn.cpp
@@ -180,7 +180,7 @@ void ConnPool::Conn::conn_server(evutil_socket_t fd, short events) {
}
}
-void ConnPool::init(NetAddr listen_addr) {
+void ConnPool::listen(NetAddr listen_addr) {
int one = 1;
if ((listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
throw ConnPoolError(std::string("cannot create socket for listening"));