tcpServer 初步框架
This commit is contained in:
parent
7031d3ceb0
commit
1454bfe044
35
includes/net/tcp/tcp_server.hpp
Normal file
35
includes/net/tcp/tcp_server.hpp
Normal 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
93
src/net/tcp/tcp_server.cc
Normal 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 中
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user