1.其实是刷到哈工大的离散数学后,觉得计算机很有意思,就学起来计算机
2.写博客最开始是把它当作任务,想着完成就完事了,毕竟就业可能会看我的博客。但是后来想了想,既然要写就写好,一是表达能提高,二是能巩固知识,三是能回头复习不需要整理
3.很拼命的写博客其实是因为想要2023博客之星的头衔,因为2022年稀里糊涂就拿到了,感觉那时候没什么难度,这次挑战一下自己的能力上限在那里,正好还在校园生活,要是上班就不一定几乎每个星期都有时间更新了
1.这期间最大的收获其实就是2023博客之星的资格,我加班加点的赶出来很有荣誉感好吧
2.近期学了计算机网络,还把其中的知识好好的复盘了一遍感觉也颇有收获。
3.上个星期刚做完一个在线五子棋的项目为了筹备面试而好好努力
写写项目,写写算法题,写写博客。没什么好强调的...
好代码展示 --- 高级IO中epoll的使用
#pragma once
#include
#include
#include
#include
#include
#include "err.hpp"
#include "log.hpp"
#include "sock.hpp"
namespace epoll_ns
{
static const int defaultport = 8888;
static const int size = 128;
static const int defaultvalue = -1;
static const int defalultnum = 64;
using func_t = std::function;
class EpollServer
{
public:
EpollServer(func_t f, uint16_t port = defaultport, int num = defalultnum)
: func_(f), _num(num), _revs(nullptr), _port(port), _listensock(defaultvalue), _epfd(defaultvalue)
{
}
void initServer()
{
// 1. 创建socket
_listensock = Sock::Socket();
Sock::Bind(_listensock, _port);
Sock::Listen(_listensock);
// 2. 创建epoll模型
_epfd = epoll_create(size);
if (_epfd < 0)
{
logMessage(FATAL, "epoll create error: %s", strerror(errno));
exit(EPOLL_CREATE_ERR);
}
// 3. 添加listensock到epoll中!
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = _listensock;
epoll_ctl(_epfd, EPOLL_CTL_ADD, _listensock, &ev);
// 4.申请就绪事件的空间
_revs = new struct epoll_event[_num];
logMessage(NORMAL, "init server success");
}
void HandlerEvent(int readyNum)
{
logMessage(DEBUG, "HandlerEvent in");
for (int i = 0; i < readyNum; i++)
{
uint32_t events = _revs[i].events;
int sock = _revs[i].data.fd;
if (sock == _listensock && (events & EPOLLIN))
{
//_listensock读事件就绪, 获取新连接
std::string clientip;
uint16_t clientport;
int fd = Sock::Accept(sock, &clientip, &clientport);
if (fd < 0)
{
logMessage(WARNING, "accept error");
continue;
}
// 获取fd成功,可以直接读取吗??不可以,放入epoll
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = fd;
epoll_ctl(_epfd, EPOLL_CTL_ADD, fd, &ev);
}
else if (events & EPOLLIN)
{
// 普通的读事件就绪
// 依旧有问题
char buffer[1024];
// 把本轮数据读完,就一定能够读到一个完整的请求吗??
int n = recv(sock, buffer, sizeof(buffer), 0);
if (n > 0)
{
buffer[n] = 0;
logMessage(DEBUG, "client# %s", buffer);
// TODO
std::string response = func_(buffer);
send(sock, response.c_str(), response.size(), 0);
}
else if (n == 0)
{
// 建议先从epoll移除,才close fd
epoll_ctl(_epfd, EPOLL_CTL_DEL, sock, nullptr);
close(sock);
logMessage(NORMAL, "client quit");
}
else
{
// 建议先从epoll移除,才close fd
epoll_ctl(_epfd, EPOLL_CTL_DEL, sock, nullptr);
close(sock);
logMessage(ERROR, "recv error, code: %d, errstring: %s", errno, strerror(errno));
}
}
else
{
// 其他事件不进行操作
}
}
logMessage(DEBUG, "HandlerEvent out");
}
void start()
{
int timeout = -1;
for (;;)
{
int n = epoll_wait(_epfd, _revs, _num, timeout);
switch (n)
{
case 0:
logMessage(NORMAL, "timeout ...");
break;
case -1:
logMessage(WARNING, "epoll_wait failed, code: %d, errstring: %s", errno, strerror(errno));
break;
default:
logMessage(NORMAL, "have event ready");
HandlerEvent(n);
break;
}
}
}
~EpollServer()
{
if (_listensock != defaultvalue)
close(_listensock);
if (_epfd != defaultvalue)
close(_epfd);
if (_revs)
delete[] _revs;
}
private:
uint16_t _port;
int _listensock;
int _epfd;
struct epoll_event *_revs;
int _num;
func_t func_;
};
}
秋招放在第一位,我九月十月必须好好的把工作找到,放下悬着的心,也想看看自己两年的努力成果是怎么样的。好好努力吧!