happy-ip开发udp server样例

主函数代码如下

#include <ip/server/udp_server.h>
#include "server_message_factory.h"
using namespace klicen::asio::ip;

int main()
{
    // 默认创建线程池的大小为4。
    //IoServicePool::singleton::Create(4); 
    uint16_t port = 1235;
    UdpServer udp_server(port);
    printf("udp server is run (port=%d)\n", port);
    udp_server.SetMessageFactory(make_shared <ServerMessageFactory>());
    IoServicePool::singleton::GetInstance()->Run();

    return EXIT_SUCCESS;
}

        主函数中只需要实例化UdpServer类,设置UdpServer类的MessageFactory。IoServicePool如果没有调用create函数, 默认创建线程池的大小为4。一定记得在最后调用IoServicePool类的run函数,启动io线程池。

server_message_factory.h代码如下

#pragma once
#include <ip/message_factory.h>
#include <utils.h>

class ServerMessageFactory : public klicen::asio::ip::MessageFactory
{
    using klicen::asio::ip::MessageFactory::MessageFactory;
    CREATE(ServerMessageFactory);
private:
    virtual bool IsConsumedForRead(const uint8_t* buffer, const size_t& length, size_t& deal_length, bool& has_package) override final;
    virtual bool HandleRead(const uint8_t* buffer, const size_t& length, string& response) override final;
};

        需要实现Create、IsConsumedForRead、HandleRead等虚函数。IsConsumedForRead函数是判断数据包是否接受完成,HandleRead表示收到完整数据包返回个用户层处理。Create函数是作为创建实例的工厂类调用。

server_message_factory.cpp代码如下

#include "server_message_factory.h"
#include <boost/asio.hpp>

bool ServerMessageFactory::IsConsumedForRead(const uint8_t* buffer, const size_t& length, size_t& deal_length, bool& has_package)
{
    uint32_t content_length = 0;
    if (length < 4 || (content_length = boost::asio::detail::socket_ops::network_to_host_long(*reinterpret_cast <const uint32_t *>(buffer))) > length - 4)
    {
        has_package = true;

        return false;
    }
    deal_length = 4 + content_length;

    return true;
}

bool ServerMessageFactory::HandleRead(const uint8_t* buffer, const size_t& length, string& response)
{
    printf("receive client data: %s\n", ToHost(buffer, length).content.c_str());
    response = ToNetwork("server response data");

    return true;
}

        设置has_package标识的同时返回false,代表数据不是一个完整的包,还有后续数据包。返回true的时候,记得设置deal_length参数哦。

运行结果如下

udp server is run (port=1235)
receive client data: 33333333333
receive client data: 33333333333
receive client data: 1111111111111
        表示绑定端口为1235,收到客户端3条信息,receive client data后面就是具体的客户端发送的数据内容。是不是很简单,,欢迎大家使用。

资源下载

      git地址为:https://github.com/wangziwen333/happy-ip

      boost库1.63版本头文件与库文件下载路径:https://download.csdn.net/download/wang19840301/10665704

windows编译参数

cmake .. -LA -DBOOST_INCLUDE_DIR='E:\git\boost\include' -DBOOST_LIB_DIR='E:\git\boost\lib\win32_debug' -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS_DEBUG="/MTd /Zi /Ob0 /Od /RTC1" -DBUILD_EXAMPLES=ON

linux编译参数

cmake .. -LA -DBOOST_INCLUDE_DIR='/mnt/e/git/boost/include' -DBOOST_LIB_DIR='/mnt/e/git/boost/lib/linux_debug' -DCMAKE_BUILD_TYPE=Debug -DBUILD_EXAMPLES=ON

猜你喜欢

转载自blog.csdn.net/wang19840301/article/details/82726300