⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 socket的事件分发模型
💻 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 + -