X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/a8690e044055da20e4cf7d7d7e51d182b5e09154..21fb8d8eb93ddba5eb08976d013d3f956bdd19d6:/stglibs/sgcp.lib/tcp.cpp?ds=inline diff --git a/stglibs/sgcp.lib/tcp.cpp b/stglibs/sgcp.lib/tcp.cpp index 414d5ec8..5d6c6cbc 100644 --- a/stglibs/sgcp.lib/tcp.cpp +++ b/stglibs/sgcp.lib/tcp.cpp @@ -12,8 +12,9 @@ using STG::SGCP::TCPProto; -TCPProto::TCPProto() - : m_sock(socket(AF_INET, SOCK_STREAM, 0)) +TCPProto::TCPProto(ba::io_service& ios) + : m_ios(ios), + m_acceptor(m_ios) { } @@ -22,31 +23,34 @@ TCPProto::~TCPProto() close(m_sock); } -void TCPProto::connect(const std::string& address, uint16_t port) +ConnectionPtr TCPProto::connect(const std::string& address, uint16_t port) { - std::vector addrs = resolve(address); - - for (size_t i = 0; i < addrs.size(); ++i) { - sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = hton(port); - addr.sin_addr = addrs[i]; - - if (::connect(m_sock, reinterpret_cast(&addr), sizeof(addr)) == 0) - return; - - close(m_sock); - m_sock = socket(AF_INET, SOCK_STREAM, 0); - } - throw Error("No more addresses to connect to."); + bs::error_code ec; + ConnectionPtr conn = boost::make_shared(m_ios); + conn.socket().connect(ba::local::stream_protocol::enpoint(address, port), ec); + if (ec) + throw Error(ec.message()); + conn->start(); + return conn; } -ssize_t TCPProto::write(const void* buf, size_t size) +void TCPProto::bind(const std::string& address, uint16_t port, Proto::AcceptHandler handler) { - return ::write(m_sock, buf, size); + bs::error_code ec; + m_acceptor.bind(address, ec); + if (ec) + throw Error(ec.message()); + + TCPConn* conn = new TCPConn(m_ios); + m_acceptor.async_accept(conn->socket(), conn->endpoint(), boost::bind(&TCPProto::m_handleAccept, this, conn, handler, boost::_1); } -ssize_t TCPProto::read(void* buf, size_t size) +void TCPProto::m_handleAccept(TCPConn* conn, Proto::AcceptHandler handler, const boost::system::error_code& ec) { - return ::read(m_sock, buf, size); + if (ec) { + delete conn; + handler(NULL, "", ec.message()); + return; + } + handler(conn, conn->enpoint().address(), ""); }