Compare commits
No commits in common. "1454bfe044d391acc0034ff6c8046d04e8d69c0d" and "fa29bd6c10d8ad77d67e33d34606a36840415f93" have entirely different histories.
1454bfe044
...
fa29bd6c10
@ -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};
|
||||
|
||||
};
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 中
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user