当前位置: 首页 > 工具软件 > ENet > 使用案例 >

ENET库(可靠UDP)

丘向荣
2023-12-01

ENet官网:http://enet.bespin.org/

NDK编译源码:http://download.csdn.net/download/yuanchunsi/10151620


ENet的目的是提供一个相对轻量、简单、稳定的基于UDP的网络通信。主要特色就是提供了可选的、可靠的、顺序传送的数据包。

ENet忽略了某些高级网络的功能,特别是特定的应用,如认证、lobbying、服务器发现,加密,或其他类似的任务等,从而保证ENET的库文件灵活,可移植,易于嵌入。


音视频网络传输中使用:解决P2P传输中的UDP丢包,乱序引起的音视频质量问题!!!



客户端:
#include <iostream>
#include <string.h>
#include "enet/enet.h"
using namespace std;

int main()
{
#if 0
    //初始化enet库
    if(enet_initialize())
    {
        cout <<"初始化失败" <<endl;
        return -1;
    }

    //创建本地HOST对象
    ENetHost *client=enet_host_create(NULL,
                                      1,   //只允许连接一个服务器
                                      0,
                                      0);
    if(client==NULL)
    {
        cout <<"创建客户端失败" <<endl;
        return -1;
    }


    //连接到服务器
    ENetAddress svraddr;
    enet_address_set_host(&svraddr,"127.0.0.1");
    svraddr.port=1234;

    ENetPeer *server=enet_host_connect(client,&svraddr,3); //client连接到svraddr对象,共分配三个通道
    if(server==NULL)
    {
        cout <<"连接服务器失败" <<endl;
        return -1;
    }

    ENetEvent event;
    //连接成功后必须调用enet_host_service来最终确认
    if (enet_host_service (client, &event, 5000) > 0 &&
            event.type == ENET_EVENT_TYPE_CONNECT)
    {
        cout <<"连接服务器成功" <<endl;
    }
    else
    {
        enet_peer_reset (server);
        cout <<"连接服务器失败" <<endl;
        return -1;
    }


    //下面开始发数据
    ENetPacket *packet=enet_packet_create(NULL,78,ENET_PACKET_FLAG_RELIABLE); //创建包
    strcpy((char*)packet->data,"hi,哈哈");
    enet_peer_send(server,1,packet);

    ENetPacket *packet1=enet_packet_create(NULL,86,ENET_PACKET_FLAG_RELIABLE); //创建包
    strcpy((char*)packet1->data,"你好啊,呵呵");
    enet_peer_send(server,2,packet1);

    enet_host_flush (client); //必须使用这个函数或是enet_host_service来使数据发出去


    //关闭连接
    enet_peer_disconnect (server,0);
    //等待关闭成功
    while (enet_host_service (client, &event, 5000)>0)
    {
        switch (event.type)
        {
        case ENET_EVENT_TYPE_RECEIVE:
            enet_packet_destroy (event.packet);
            break;

        case ENET_EVENT_TYPE_DISCONNECT:
            cout <<"已经成功断开连接" <<endl;
            enet_deinitialize();
            return -1;
        }
    }

    //这里就是关闭失败,强制重置
    enet_peer_reset(server);
    cout <<"强制重置" <<endl;

    enet_deinitialize();
#endif

    char k = 0;

        for(int i = 0; i < 127; i ++)
        {
            k += i & 3;
             printf("<ycs>k:%d\n",k);
        }
        printf("k:%d\n",k);
        return 0;


}
//---------------------------------------------华丽分割线-------------------------------------------------------//
服务端:
#include <iostream>
#include "enet/enet.h"
using namespace std;

int main()
{
    //初始化enet库
    if(enet_initialize())
    {
        cout <<"初始化失败" <<endl;
        return -1;
    }

    //下面创建服务器
    ENetAddress address;
    address.host=ENET_HOST_ANY;
    address.port=1234;

    ENetHost *server;
    server=enet_host_create(&address, //主机地址
                            64,        //允许的连接数
                            0,
                            0);        //自动管理带宽
    if(server==NULL)
    {
        cout <<"创建主机对象失败" <<endl;
        enet_deinitialize();
        return -1;
    }


    //下面开始收数据等
    ENetEvent event;
    while(enet_host_service(server,&event,5000)>=0)
    {
        if(event.type==ENET_EVENT_TYPE_CONNECT) //有客户机连接成功
        {
            static unsigned int num=0;
            ENetAddress remote=event.peer->address; //远程地址
            char ip[256];
            enet_address_get_host_ip(&remote,ip,256);
            cout <<"ip:" <<ip <<" 已经连接,序号:" <<num <<endl;
            event.peer->data=(void*)num++;
        }
        else if(event.type==ENET_EVENT_TYPE_RECEIVE) //收到数据
        {
            cout <<"收到序号" <<event.peer->data <<"的数据,从" <<event.channelID <<"通道发送" <<endl;
            cout <<"数据大小:" <<event.packet->dataLength <<endl;
            cout <<"数据:" <<(char*)event.packet->data <<endl;
            enet_packet_destroy(event.packet);    //注意释放空间
            cout <<endl;
        }
        else if(event.type==ENET_EVENT_TYPE_DISCONNECT) //失去连接
        {
            cout <<"序号" <<event.peer->data <<"远程已经关闭连接" <<endl;
        }
    }

    enet_deinitialize();
}





 类似资料: