diff --git a/includes/net/tcp/tcp_server.hpp b/includes/net/tcp/tcp_server.hpp new file mode 100644 index 0000000..1e4ed4c --- /dev/null +++ b/includes/net/tcp/tcp_server.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "coroutine.hpp" +#include "net_address.hpp" +#include "reactor.hpp" + +namespace tinyrpc { + class TcpAcceptor{ + public: + TcpAcceptor(const NetAddress& netAddr); + void init(); + int accept(); + private: + int m_listenfd{-1}; + NetAddress m_bindNetAddr; + }; + + class TcpServer{ + + public: + TcpServer(); + TcpServer(const NetAddress& addr); + void start(); + private: + void mainAcceptCorFun(); + private: + + // Reactor* m_reactor{nullptr}; + Coroutine m_accept_cor; + TcpAcceptor m_acceptor; + bool m_stop_accept{false}; + // int m_conn_cnt{0}; + + }; + +} \ No newline at end of file diff --git a/src/net/tcp/tcp_server.cc b/src/net/tcp/tcp_server.cc new file mode 100644 index 0000000..6bd66d0 --- /dev/null +++ b/src/net/tcp/tcp_server.cc @@ -0,0 +1,93 @@ +#include "tcp_server.hpp" +#include "coroutine.hpp" +#include "fd_event.hpp" +#include "logger.hpp" +#include "coroutine_hook.hpp" +#include "net_address.hpp" +#include "reactor.hpp" +#include +#include +#include +#include +#include + + +namespace tinyrpc { + TcpAcceptor::TcpAcceptor(const NetAddress& bindNetAddr) : m_bindNetAddr(bindNetAddr) { + + } + void TcpAcceptor::init() { + m_listenfd = socket(AF_INET, SOCK_STREAM,0); + FdEvent(m_listenfd).setNonblock(); + if(m_listenfd == -1) { + logger() << "socket ret -1 err:" << strerror(errno); + exit(-1); + } + int val = 1; + if (setsockopt(m_listenfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) { + logger() << "setsockopt ret < 0 err:" << strerror(errno);; + exit(-1); + } + + int ret = bind(m_listenfd, m_bindNetAddr.getSockaddr(), m_bindNetAddr.getSockLen()); + + if(ret == -1) { + logger() << "bind ret -1 err:" << strerror(errno); + exit(-1); + } + + if(listen(m_listenfd, 5) == -1) { + logger() << "listen ret -1 err:" << strerror(errno); + exit(-1); + } + + } + int TcpAcceptor::accept() { + sockaddr_in addr{}; + socklen_t len = sizeof(addr); + int ret = accept_hook(m_listenfd, reinterpret_cast(&addr), &len); + if(ret == -1) { + logger() << "accept_hook ret -1 err:" << strerror(errno); + } + logger() << "accept: " << NetAddress(&addr).toString(); + return ret; + } + + + TcpServer::TcpServer() : + m_accept_cor(1 * 1024 * 1024, std::bind(&TcpServer::mainAcceptCorFun, this)), + m_acceptor(NetAddress()) + { + + } + TcpServer::TcpServer(const NetAddress& addr) : + m_accept_cor(1 * 1024 * 1024, std::bind(&TcpServer::mainAcceptCorFun, this)), + m_acceptor(addr) + { + m_acceptor.init(); + } + void TcpServer::start() { + + m_accept_cor.resume(); + Reactor* mainReactor = Reactor::getReactor(); + mainReactor->loop(); + } + + void TcpServer::mainAcceptCorFun() { + while(!m_stop_accept) { + int fd = m_acceptor.accept(); + if(fd == -1) { + logger() << "m_acceptor.accept() ret -1 yeild this coroutine"; + Coroutine::yeild(); + } + // FdEvent fe(fd); + logger() << "new connect fd = " << fd; + + // close(fd); + // TODO ... + // 添加 fd 到子 reactor 中 + + } + + } +} \ No newline at end of file