tcpServer 初步框架

This commit is contained in:
yhy 2024-12-23 21:12:18 +08:00
parent 7031d3ceb0
commit 1454bfe044
2 changed files with 128 additions and 0 deletions

View File

@ -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};
};
}

93
src/net/tcp/tcp_server.cc Normal file
View File

@ -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 <cerrno>
#include <cstring>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
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<sockaddr*>(&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 中
}
}
}