]> git.stg.codes - stg.git/blob - stglibs/sgcp.lib/tcp.cpp
5d6c6cbc2b6b21be33f5df3e1ea330a653cb58cb
[stg.git] / stglibs / sgcp.lib / tcp.cpp
1 #include "tcp.h"
2
3 #include "stg/sgcp_utils.h"
4
5 #include <cerrno>
6 #include <cstring>
7
8 #include <sys/types.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <netinet/tcp.h>
12
13 using STG::SGCP::TCPProto;
14
15 TCPProto::TCPProto(ba::io_service& ios)
16     : m_ios(ios),
17       m_acceptor(m_ios)
18 {
19 }
20
21 TCPProto::~TCPProto()
22 {
23     close(m_sock);
24 }
25
26 ConnectionPtr TCPProto::connect(const std::string& address, uint16_t port)
27 {
28     bs::error_code ec;
29     ConnectionPtr conn = boost::make_shared(m_ios);
30     conn.socket().connect(ba::local::stream_protocol::enpoint(address, port), ec);
31     if (ec)
32         throw Error(ec.message());
33     conn->start();
34     return conn;
35 }
36
37 void TCPProto::bind(const std::string& address, uint16_t port, Proto::AcceptHandler handler)
38 {
39     bs::error_code ec;
40     m_acceptor.bind(address, ec);
41     if (ec)
42         throw Error(ec.message());
43
44     TCPConn* conn = new TCPConn(m_ios);
45     m_acceptor.async_accept(conn->socket(), conn->endpoint(), boost::bind(&TCPProto::m_handleAccept, this, conn, handler, boost::_1);
46 }
47
48 void TCPProto::m_handleAccept(TCPConn* conn, Proto::AcceptHandler handler, const boost::system::error_code& ec)
49 {
50     if (ec) {
51         delete conn;
52         handler(NULL, "", ec.message());
53         return;
54     }
55     handler(conn, conn->enpoint().address(), "");
56 }