尝试新思路——CError、CExit和CNetworkEvent的一种实现

CMyError类的实现:

#ifndef __MYERROR_H__
#define __MYERROR_H__

#include "Error.h"

class CMyError : public LinWin::CError
{
public:
    virtual int OnError(int level) { return -1; }
    virtual int OnError(int code, int level) { return 0; }
};

#endif

一个接口返回了-1,一个接口返回 了0;算是最简单的一个实现类了吧,具体的实现类可以更复杂,这就根据需求了。我在这里,只是给出一个最简单的处理。
返回-1(非0)表示,表示不作任何处理,让调用者使用默认处理。返回0,表示已处理过了,调用者不需要再处理。

CMyExit类:

#ifndef __MYEXIT_H__
#define __MYEXIT_H__

#include "Exit.h"

class CMyExit : public LinWin::CExit
{
private:
    bool  m_bExit;
public:
    CMyExit() : m_bExit(false) {}
    bool OnExit() { return m_bExit; }
    void SetExit() { m_bExit = true; }
};

#endif

退出的实现类也很简单,就一个数据成员,两个接口的实现也都是只有一行代码。

CMySelectEvent类
头文件 MySelectEvent.h

#ifndef __MYSELECTEVENT_H__
#define __MYSELECTEVENT_H__

#include "SocketImpl.h"
#include "TcpClient.h"
#include "NetworkEvent.h"
#include "Exit.h"
#include <map>

class CMySelectEvent : public LinWin::CNetworkEvent
{
private:
    LinWin::CSocketImpl* m_server;
    LinWin::CExit*       m_exit;
    std::map<net_socket_fd, LinWin::CTcpClient*> m_mapClients;

public:
    CMySelectEvent();
    CMySelectEvent(LinWin::CSocketImpl* server, LinWin::CExit* exit);
    ~CMySelectEvent();
    void SetServer(LinWin::CSocketImpl* server);
    void SetExit(LinWin::CExit* exit);
    virtual int OnAccept(net_socket_fd &fdAccept);
    virtual int OnRead(net_socket_fd fd);
    virtual int OnWrite(net_socket_fd fd);
    virtual int OnClose(net_socket_fd fd);
};

#endif

实现文件CMySelectEvent.cpp

#include "MySelectEvent.h"
#include "Exit.h"
#include <iostream>

CMySelectEvent::CMySelectEvent() : m_server(NULL), m_exit(NULL)
{

}

CMySelectEvent::CMySelectEvent(LinWin::CSocketImpl* server, LinWin::CExit* exit) : m_server(server), m_exit(exit)
{

}

CMySelectEvent::~CMySelectEvent()
{

}

void CMySelectEvent::SetServer(LinWin::CSocketImpl* server)
{
    m_server = server;
}

void CMySelectEvent::SetExit(LinWin::CExit* exit)
{
    m_exit = exit;
}

int CMySelectEvent::OnAccept(net_socket_fd &fdAccept)
{
    LinWin::CSocketAddress clientAddr;
    LinWin::CTcpClient* sockClient = new LinWin::CTcpClient;
    if (!sockClient)
        return -1;
    if (sockClient->Create(true) != 0)
        return -1;

    if (m_server->Accept(sockClient->Handle(), clientAddr) != 0)
        return -1;

    fdAccept = sockClient->Sockfd();
    m_mapClients.insert(std::make_pair(fdAccept, sockClient));

    std::cout << "Recevie a connect: " << clientAddr.ToString() << std::endl;

    //sockClient->Close();

    return 0;
}

int CMySelectEvent::OnRead(net_socket_fd fd)
{
    char buf[1024] = { 0 };
    if (m_mapClients.find(fd) == m_mapClients.end())
        return -1;

    int ret = m_mapClients[fd]->Recv(buf, 1023);
    if (ret == NET_SOCKET_ERROR || ret == 0)
        return -1;

    buf[ret] = '\0';
    std::cout << "Receive: " << buf << std::endl;

    return 0;
}

int CMySelectEvent::OnWrite(net_socket_fd fd)
{
    std::cout << "OnWrite" << std::endl;

    return 0;
}

int CMySelectEvent::OnClose(net_socket_fd fd)
{
    if (m_mapClients.find(fd) == m_mapClients.end())
        return -1;
    delete m_mapClients[fd];
    m_mapClients.erase(fd);

    std::cout << "Close a client." << std::endl;

    if (m_mapClients.size() == 0)
    {
        m_exit->SetExit();
        std::cout << "All clients quit." << std::endl;
    }

    return 0;
}

这个事件类的实现,比较麻烦,多用了一个map类。其实,完全可以把这个map类省掉。因为,有这样CSocketImpl(net_socket_fd sockfd)的构造函数。我可以很容易的包装一个net_socket_fd。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值