📄 main.cpp
字号:
#include <stdio.h>
#include "z_reactor.h"
selector g_set(1024);
class echo_socket : public fdbase
{
public:
explicit echo_socket(SOCKET sk) : m_socket(sk), m_len(0), m_idx(-1)
{}
int get_events(int& events) const // 取得文件描述符及fdbase当前关注的事件
{
if (m_len > 0){
events = FDEVENT_OUT;
}else{
events = FDEVENT_IN;
}
return m_socket;
}
int get_fd() const // 取得文件描述符
{
return m_socket;
}
HRET do_read(){
m_len = ::recv(m_socket, m_buf, sizeof(m_buf), 0);
if (m_len <= 0){
printf("disconnect\n");
g_set.remove(m_idx);
delete this;
return -1;
}
m_buf[m_len] = 0;
printf("%s", m_buf);
g_set.set_events(m_idx, FDEVENT_OUT);
return 0;
}
HRET do_write(){
if (m_len > 0){
int len = ::send(m_socket, m_buf, m_len, 0);
if (m_len < 0){
printf("disconnect\n");
g_set.remove(m_idx);
delete this;
return -1;
}
m_len -= len;
g_set.set_events(m_idx, FDEVENT_IN);
}
return 0;
}
void set_idx(int idx){
m_idx = idx;
}
protected:
char m_buf[1024];
int m_len;
SOCKET m_socket;
int m_idx;
};
class listener : public fdbase
{
public:
int get_events(int& events) const // 取得文件描述符及fdbase当前关注的事件
{
events = FDEVENT_IN | FDEVENT_OUT;
return m_socket;
}
int get_fd() const // 取得文件描述符
{
return m_socket;
}
HRET do_read(){
sockaddr_in addr;
socklen_t len = sizeof(addr);
SOCKET sk = accept(m_socket, (sockaddr*)&addr, &len);
printf("accept a connection: %s, socket: %d\n", inet_ntoa(addr.sin_addr), sk);
echo_socket* p = new echo_socket(sk);
p->set_idx(g_set.add(*p, FDEVENT_IN));
return 0;
}
SOCKET m_socket;
};
int main()
{
listener sk;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(7798);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
SOCKET_INIT();
sk.m_socket = socket(AF_INET, SOCK_STREAM, 0);
bind(sk.m_socket, (const sockaddr*)&addr, sizeof(addr));
listen(sk.m_socket, 5);
g_set.add(sk, FDEVENT_IN);
for(;;)
{
timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
HRET hret = g_set.wait(&tv);
if (hret == 0){
printf(".");
fflush(stdout);
}else if(hret < 0){
printf("error! ret=%d,reason:%s\n",hret,strerror(errno));
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -