libuv简单tcp和udp demo

it2024-08-01  38

//服务端test代码 

void TestTcpSvrFunc() {     uv::CLooper* ptrLooper = new uv::CLooper;     ptrLooper->InitLooper();     uv::CTcpServer server(DEF_PACK_HEAD_FLAG);     server.AttachLooper(ptrLooper);     server.OnNewConnectCBEvent([](int clientid, void* userdata){         uv::CTcpClientSession *theclass = (uv::CTcpClientSession *)userdata;         LOGI("new connect:%d\n", clientid);     });     server.OnTcpClientCloseCBEvent([](int clientid, void* userdata){         LOGI("cliend %d closed", clientid);         uv::CTcpClientSession *theclass = (uv::CTcpClientSession *)userdata;     });     server.OnTcpClientRecvCBEvent([](NetPacket* pNetPacket, void* userdata){         uv::CTcpClientSession *pSession = (uv::CTcpClientSession *)userdata;         char szRecvData[1024] = {0};         std::memcpy(szRecvData, pNetPacket->data, pNetPacket->dataSize);         LOGI("clientid=%d recv=%s", pSession->GetClientId(), szRecvData);         //send back         int pack_size = pNetPacket->dataSize + NET_PACKAGE_HEADLEN;         std::string buffer;         buffer.resize(pack_size);         memcpy(&(buffer[0]), (void*)pNetPacket, NET_PACKAGE_HEADLEN);         memcpy(&(buffer[NET_PACKAGE_HEADLEN]), pNetPacket->data, pNetPacket->dataSize);         pSession->Send((char*)&buffer[0], buffer.size());                  //test shutdown         //pSession->ShutDown();     });     if(!server.Start("0.0.0.0", 6666)) {         LOGE("Start Server error:%s\n", server.GetLastErrMsg());     }     server.SetKeepAlive(1, 60);     LOGI("tcp server on main.");     if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, true))     {         while (1) { Sleep(1000); }     }     else     {         delete ptrLooper;         ptrLooper = nullptr;         printf("exit \r\n");     } } void TestUdpSvrFunc() {     std::string strLocal = "127.0.0.1";     const int port = 6666;     uv::CLooper* ptrLooper = new uv::CLooper;     ptrLooper->InitLooper();     uv::CUvUdp* ptrSvr = new uv::CUvUdp();     ptrSvr->AttachLooper(ptrLooper);     ptrSvr->Bind(strLocal.c_str(), port);     ptrSvr->OnRecvCBEvent([ptrSvr](const char* buffer, int size, const struct sockaddr* pAddr, unsigned iFlag, void* userdata){         uv::CUvUdp* pClient = (uv::CUvUdp*)userdata;         char szRecvData[1024] = {0};         std::memcpy(szRecvData, buffer, size);         struct sockaddr_in *sock = ( struct sockaddr_in*)pAddr;         int port = ntohs(sock->sin_port);         LOGI("[RECV][ip=%s][port=%d] =>---%s",  inet_ntoa(sock->sin_addr), port, szRecvData);         ptrSvr->Send(buffer, size, pAddr);         LOGI("[SEND_BACK] =>+++%s",  szRecvData);     });     LOGI("udp server on main.");     if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, true))     {         while (1) { Sleep(1000); }     }     else     {         delete ptrLooper;         ptrLooper = nullptr;         printf("exit \r\n");     } } int _tmain(int argc, _TCHAR* argv[]) {     TestTcpSvrFunc();     //TestUdpSvrFunc();     return 0; }

 //客户端 

std::string PacketData(int clientId, const char* data, int dataSize) {     uint32_t pack_size = dataSize + NET_PACKAGE_HEADLEN;     NetPacket netPacket;     netPacket.flag = DEF_PACK_HEAD_FLAG;     netPacket.type = clientId;     netPacket.dataSize = dataSize;     std::string buffer;     buffer.resize(pack_size);     memcpy(&(buffer[0]), (const char*)&netPacket, 12);     memcpy(&(buffer[12]), data, dataSize);     return buffer; } void SetConsoleColor(unsigned short ForeColor=0, unsigned short BackGroundColor=0) {     HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor); } int call_time = 0; void TestTcpClientFunc() {     const int clientsize = 5;     std::string strServerIp = "127.0.0.1";     const int port = 6666;     uv::CLooper* ptrLooper = new uv::CLooper;     ptrLooper->InitLooper();     std::map<int, uv::CTcpClient*> clientMap;     for (int i = 0; i < clientsize; ++i) {         uv::CTcpClient* ptrClient = new uv::CTcpClient(DEF_PACK_HEAD_FLAG);         clientMap[ptrClient->GetClientId()] = ptrClient;         ptrClient->AttachLooper(ptrLooper);         ptrClient->OnConnectCBEvent([](int status, void* userdata){             uv::CTcpClient* pClient = (uv::CTcpClient*)userdata;             if(status == uv::CTcpClient::TCP_STATUS_CONNECTED){                 LOGI("client_id=%d connect succeed.", pClient->GetClientId());             }             else{                 LOGI("client_id=%d connect error=%s.", pClient->GetClientId(),  pClient->GetLastErrMsg());             }         });                  ptrClient->OnRecvCBEvent([](NetPacket* pNetPacket, void* userdata){             uv::CTcpClient* pClient = (uv::CTcpClient*)userdata;             char szRecvData[1024] = {0};             std::memcpy(szRecvData, pNetPacket->data, pNetPacket->dataSize);             LOGI("[RECV][id=%d] =>---%s",  pClient->GetClientId(), szRecvData);         });         ptrClient->OnCloseCBEvent([&clientMap](int clientid, void* userdata){             uv::CTcpClient* pClient = (uv::CTcpClient*)userdata;             LOGI("[CLOSE][id=%d]", clientid);         });         ptrClient->Connect(strServerIp.c_str(), port);     }     char senddata[256];     int nTry = 500;     while (nTry > 0)      {         for (auto iter = clientMap.begin(), iterEnd = clientMap.end();             iter != iterEnd; iter++) {             uv::CTcpClient* pClient = iter->second;             if(pClient->IsConnected())             {                 memset(senddata, 0, sizeof(senddata));                 sprintf(senddata, "%d", ++call_time);                 std::string str = PacketData(pClient->GetClientId(), senddata, strlen(senddata));                 if (pClient->Send(&str[0], str.length()) <= 0) {                     LOGI("[ERROR][id=%d] =>%s",  pClient->GetClientId(), pClient->GetLastErrMsg());                 } else {                     LOGI("[SEND][id=%d] =>+++%s",  pClient->GetClientId(), senddata);                 }             }                      }         nTry--;         Sleep(10);     }     //shutdow all     for (auto iter = clientMap.begin(), iterEnd = clientMap.end();         iter != iterEnd; iter++) {             uv::CTcpClient* pClient = iter->second;             if(pClient->IsConnected())             {                 pClient->Shutdown();             }     }     delete ptrLooper;     ptrLooper = nullptr;     //delete      for (auto iter = clientMap.begin(), iterEnd = clientMap.end();         iter != iterEnd; iter++) {             uv::CTcpClient* pClient = iter->second;             delete pClient;             pClient = nullptr;     }     clientMap.clear(); } void TestUdpClientFunc() {     std::string strServerIp = "127.0.0.1";     const int port = 6666;     uv::CLooper* ptrLooper = new uv::CLooper;     ptrLooper->InitLooper();     uv::CUvUdp* ptrClient = new uv::CUvUdp();     ptrClient->AttachLooper(ptrLooper);     ptrClient->Bind("127.0.0.1", 3333);     ptrClient->OnRecvCBEvent([](const char*_buff, int size, const struct sockaddr* pAddr, unsigned iFlag, void* userdata){         uv::CUvUdp* pClient = (uv::CUvUdp*)userdata;         char szRecvData[1024] = {0};         std::memcpy(szRecvData, _buff, size);         LOGI("[RECV] =>---%s",  szRecvData);     });     char senddata[256];     int nTry = 500;     while (nTry > 0)      {         memset(senddata, 0, sizeof(senddata));         sprintf(senddata, "%d", ++call_time);         if (ptrClient->Send(senddata, strlen(senddata), strServerIp.c_str(), port) <= 0) {             LOGI("[ERROR] =>%s",  ptrClient->GetLastErrMsg());         } else {             LOGI("[SEND] =>+++%s",  senddata);         }         nTry--;         Sleep(10);     }     delete ptrLooper;     ptrLooper = nullptr;     //delete      delete ptrClient;     ptrClient = nullptr; } int _tmain(int argc, _TCHAR* argv[]) {     TestTcpClientFunc();     //TestUdpClientFunc();     system("pause");     return 0; }

demo详细代码可以到github查看:https://github.com/zym479466697/TestLibuv.git

最新回复(0)