Compare commits

..

No commits in common. "1454bfe044d391acc0034ff6c8046d04e8d69c0d" and "fa29bd6c10d8ad77d67e33d34606a36840415f93" have entirely different histories.

3 changed files with 6 additions and 156 deletions

View File

@ -1,35 +0,0 @@
#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};
};
}

View File

@ -1,8 +1,6 @@
#include "coroutine_hook.hpp"
#include "coroutine.hpp"
#include "logger.hpp"
#include "fd_event.hpp"
#include "reactor.hpp"
#include <dlfcn.h>
@ -24,44 +22,24 @@ namespace tinyrpc {
ssize_t read_hook(int fd, void *buf, size_t count) {
logger() << "read_hook is calling";
FdEvent fe(fd);
fe.addListenEvent(IOEvent::READ);
Coroutine* curCoro = Coroutine::getCurrCoroutine();
fe.setReadCallback([curCoro] () -> void{
curCoro->resume();
});
// TODO ...
// fd 设置为 nonblock
fe.setNonblock();
// 尝试一下系统read 返回值大于0直接返回
int ret = g_sys_read_fun(fd, buf, count);
if(ret > 0) return ret;
// fd 添加到 epoll 中
Reactor::getReactor()->addFdEvent(&fe);
Coroutine::yeild(); // yeild
Reactor::getReactor()->delFdEvent(&fe);
// 调用系统 read 返回
return g_sys_read_fun(fd, buf, count);
return -1;
}
ssize_t write_hook(int fd, const void *buf, size_t count) {
logger() << "write_hook is calling";
FdEvent fe(fd);
fe.addListenEvent(IOEvent::WRITE);
Coroutine* curCoro = Coroutine::getCurrCoroutine();
fe.setWriteCallback([curCoro] () -> void{
curCoro->resume();
});
// TODO ...
// fd 设置为 nonblock
fe.setNonblock();
// 尝试一下系统 write 返回值大于0直接返回
int ret = g_sys_write_fun(fd, buf, count);
if(ret > 0) return ret;
// 尝试一下系统read 返回值大于0直接返回
// fd 添加到 epoll 中
Reactor::getReactor()->addFdEvent(&fe);
Coroutine::yeild(); // yeild
Reactor::getReactor()->delFdEvent(&fe);
// 调用系统 write 返回
return g_sys_write_fun(fd, buf, count);
// 调用系统 read 返回
return -1;
}
}

View File

@ -1,93 +0,0 @@
#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 中
}
}
}