Skip to content

UDPRecv::run应该消除一些不必要的操作 #286

Description

@dyx2025

UDPRecv::run应该消除一些不必要的操作

UDPRecv::run用于接收udp消息,存在以下不必要的操作:

  1. m_iSockFD是阻塞的fd,recvfrom自然就会阻塞等待数据可读。这样就没必要在recvfrom之前加poll等待数据可读。
  2. 代码没有使用地址结构addr的地方,所以recvfrom没必要获取地址结构addr。

原代码路径:
src/communicate/udp.cpp

void UDPRecv :: run()
{
    m_bIsStarted = true;

    char sBuffer[65536] = {0};

    struct sockaddr_in addr;
    socklen_t addr_len = sizeof(struct sockaddr_in);
    memset(&addr, 0, sizeof(addr));

    while(true)
    {   
        if (m_bIsEnd)
        {   
            PLHead("UDPRecv [END]");
            return;
        }   

        // m_iSockFD是阻塞的fd,recvfrom自然就会阻塞等待数据可读。这样就没必要在recvfrom之前加poll等待数据可读
        struct pollfd fd; 
        int ret;

        fd.fd = m_iSockFD;
        fd.events = POLLIN;
        ret = poll(&fd, 1, 500);

        if (ret == 0 || ret == -1) 
        {   
            continue;
        }   

        // 代码没有使用地址结构addr的地方,所以recvfrom没必要获取地址结构addr            
        int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
                (struct sockaddr *)&addr, &addr_len);

        //printf("recvlen %d, buffer %s client %s\n",
                //iRecvLen, sBuffer, inet_ntoa(addr.sin_addr));
            
        BP->GetNetworkBP()->UDPReceive(iRecvLen);

        if (iRecvLen > 0)
        {   
            m_poDFNetWork->OnReceiveMessage(sBuffer, iRecvLen);
        }   
    }   
}

修改后的代码路径:
src/communicate/udp.cpp

void UDPRecv :: run()
{
    m_bIsStarted = true;

    char sBuffer[65536] = {0};

    // 删除代码
    /*
    struct sockaddr_in addr;
    socklen_t addr_len = sizeof(struct sockaddr_in);
    memset(&addr, 0, sizeof(addr));
    */

    while(true)
    {   
        if (m_bIsEnd)
        {   
            PLHead("UDPRecv [END]");
            return;
        }   

        // 删除代码
        /*
        struct pollfd fd; 
        int ret;

        fd.fd = m_iSockFD;
        fd.events = POLLIN;
        ret = poll(&fd, 1, 500);

        if (ret == 0 || ret == -1) 
        {   
            continue;
        }
        */   
        
        /*  
        int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
                (struct sockaddr *)&addr, &addr_len);
        */
 
        // 修改代码
        int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
                NULL, NULL);

        //printf("recvlen %d, buffer %s client %s\n",
                //iRecvLen, sBuffer, inet_ntoa(addr.sin_addr));
            
        BP->GetNetworkBP()->UDPReceive(iRecvLen);

        if (iRecvLen > 0)
        {   
            m_poDFNetWork->OnReceiveMessage(sBuffer, iRecvLen);
        }   
    }   
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions