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