#include "TransPortEngineSdk.h" #pragma comment(lib, "TransPortEngineSdk.lib") class TransPortRecv :public ITransPortEngineRecv { public: virtual voi...-Go服务器开发" />

ZBLOG

// TcpServerTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include #include "TransPortEngineSdk.h" #pragma comment(lib, "TransPortEngineSdk.lib") class TransPortRecv :public ITransPortEngineRecv { public: virtual voi...

你的代码看起来是一个简单的 TCP 服务器实现,使用了一个名为 TransPortEngineSdk 的库。下面是对该代码的一些解释和可能的改进建议:

代码结构解析

  1. 类定义

    • TransPortRecv 类继承自 ITransPortEngineRecv 接口,该接口需要实现接收数据和通知连接状态的方法。
  2. 方法实现

    • OnTransPortEngineRecv: 当接收到数据时被调用,打印接收到的数据并将其回传。
    • OnTransPortEngineNotify: 当连接或断开连接事件发生时被调用,记录连接计数和断开计数,并打印相关信息。
  3. 初始化与销毁

    • TransPortRecv_Init: 初始化 TCP 服务器,如果初始化失败则返回错误代码。
    • TransPortRecv_Unit: 销毁服务器实例。
  4. 主函数

    • 创建 TransPortRecv 实例并初始化服务器。
    • 使用无限循环等待输入(可以用 Ctrl+C 停止),然后在退出前清理资源。

改进建议

  1. 内存管理:当前你在创建 TransPortRecv 对象时使用了动态分配,但没有释放它。在程序结束前应该删除它,以避免内存泄漏。例如:

    delete pTransPortRecv;
    
  2. 异常处理:为了提高健壮性,可以在操作如服务器初始化和销毁时添加更多的错误处理逻辑,并考虑记录或输出详细错误信息。

  3. 多线程支持:如果有多个客户端同时连接,可能需要考虑使用多线程来处理每个会话。如果 SDK 支持的话,可以查看如何在不同线程中安全地访问共享资源。

  4. 用户输入更友好:目前使用的是 getchar() 等待用户输入,可以考虑提供更明确的退出指令提示给用户,比如输入 “exit” 来关闭服务器。

  5. 编码风格:尽量遵循一致的命名规范,如变量和函数名应有意义,并符合项目中的约定。

  6. 日志功能:对于实际应用,可以集成日志库以便于后期调试与维护,而不是仅仅使用 printf() 输出信息。

示例改进后的代码片段

#include <iostream>
#include "TransPortEngineSdk.h"

#pragma comment(lib, "TransPortEngineSdk.lib")

class TransPortRecv : public ITransPortEngineRecv {
public:
    virtual void OnTransPortEngineRecv(int nSessionId, const unsigned int nRecvDataLen, const char *szRecvData, void *pUser);
    virtual void OnTransPortEngineNotify(int nSessionId, int nMsgType, char *szMsgDescribe, void *pUser);

    int TransPortRecv_Init();
    int TransPortRecv_Unit();

private:
    void* m_pTransPortEngine;
};

void TransPortRecv::OnTransPortEngineRecv(int nSessionId, const unsigned int nRecvDataLen, const char *szRecvData, void *pUser) {
    printf("%s %d\n", szRecvData, nRecvDataLen);
    TransPortEngine_ServerSendTo(pUser, nRecvDataLen, szRecvData, NULL);
}

int nConnectCount = 0;
int nDisconnectCount = 0;

void TransPortRecv::OnTransPortEngineNotify(int nSessionId, int nMsgType, char *szMsgDescribe, void *pUser) {
    if (nMsgType == CONNECT) {
        ++nConnectCount;
    } else if (nMsgType == DISCONNECT) {
        ++nDisconnectCount;
    }
    
    printf("Session ID: %d | Message Type: %d | Connect Count: %d | Disconnect Count: %d\n",
           nSessionId, nMsgType, nConnectCount, nDisconnectCount);
}

int TransPortRecv::TransPortRecv_Init() {
    int ret = TransPortEngine_Init();
    
    if (ret < 0) return -1;

    m_pTransPortEngine = TransPortEngine_CreateServer(13250, 1, 3, this, false , true);
    
    if (nullptr == m_pTransPortEngine) return -2;

    return 0;
}

int TransPortRecv::TransPort_recv_Unit() {
     // Improved error handling
     if(m_pTransportengine != nullptr)
     { 
        return TransportEnginedestroyServer(m_pTransportengine); 
     }
     
     return-1; 
}

int main() {
     auto pTransportrecv= new TransportRecieve; 
     
     if(pTransportrecv->TransportReceive_init()<0){ 
         std::cerr << "Initialization failed!" << std::endl; 
         return-1; 
     }

     std::cout << "Press 'Enter' to stop the server..." << std::endl;
     
     while(getchar() != '\n'){}
     
     delete pTransportrecv;

      // Cleanup before exiting
      TransportReceive_unit(); 

       return0;  
}

这只是一些基本的改进方向,你可以根据需求进一步优化你的代码。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处: #include "TransPortEngineSdk.h" #pragma comment(lib, "TransPortEngineSdk.lib") class TransPortRecv :public ITransPortEngineRecv { public: virtual voi...">https://golang.0voice.com/?id=20342

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?