Skip to content

优化目标节点地址信息在发送消息路径上的传递方式 #281

Description

@dyx2025

优化目标节点地址信息在发送消息路径上的传递方式

目前的传递方式是,先把64位的nodeid转为NodeInfo,再从NodeInfo获取ip和port,再把ip和port转换为sockaddr_in。其实64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略。传递ip和port过程中,带来了一些额外操作(详情请看下文的源码注释)。发送消息路径是热路径,有必要优化传递方式。

原代码路径:

src/communicate/communicate.h

class Communicate : public MsgTransport                                                     
{                                                                                           
    // ......
    // 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略                                                                              
    int Send(const int iGroupIdx, const nodeid_t iNodeID,                                                                                                                               
            const NodeInfo & tNodeInfo, const std::string & sMessage, const int iSendType);
    // ......                                                                 
};  

src/communicate/communicate.cpp

//  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID, 
        const NodeInfo & oNodeInfo, const std::string & sMessage, const int iSendType)
{
    if ((int)sMessage.size() > MAX_VALUE_SIZE)
    {   
        BP->GetNetworkBP()->SendRejectByTooLargeSize();
        PLGErr("Message size too large %zu, max size %u, skip message", 
                sMessage.size(), MAX_VALUE_SIZE);
        return 0;
    }   

    BP->GetNetworkBP()->Send(sMessage);
        
    if (sMessage.size() > m_iUDPMaxSize || iSendType == Message_SendType_TCP)
    {   
        BP->GetNetworkBP()->SendTcp(sMessage);
        return m_poNetwork->SendMessageTCP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
    }   
    else
    {   
        BP->GetNetworkBP()->SendUdp(sMessage);
        return m_poNetwork->SendMessageUDP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
    }   
}

int Communicate :: SendMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage, const int iSendType)
{
    return Send(iGroupIdx, iSendtoNodeID, NodeInfo(iSendtoNodeID), sMessage, iSendType);
}

int Communicate :: BroadcastMessage(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::set<nodeid_t> & setNodeInfo = m_poConfig->GetSystemVSM()->GetMembershipMap();
        
    for (auto & it : setNodeInfo)
    {   
        if (it != m_iMyNodeID)
        {   
            Send(iGroupIdx, it, NodeInfo(it), sMessage, iSendType);
        }   
    }   

    return 0;
}

int Communicate :: BroadcastMessageFollower(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::map<nodeid_t, uint64_t> & mapFollowerNodeInfo = m_poConfig->GetMyFollowerMap(); 
        
    for (auto & it : mapFollowerNodeInfo)
    {
        if (it.first != m_iMyNodeID)
        {
            Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
        }
    }
    
    PLGDebug("%zu node", mapFollowerNodeInfo.size());

    return 0;
}

int Communicate :: BroadcastMessageTempNode(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::map<nodeid_t, uint64_t> & mapTempNode = m_poConfig->GetTmpNodeMap(); 
    
    for (auto & it : mapTempNode)
    {
        if (it.first != m_iMyNodeID)
        {
            Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
        }
    }
    
    PLGDebug("%zu node", mapTempNode.size());

    return 0;
}

include/phxpaxos/network.h

class NetWork
{
    // ......
    //  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
    virtual int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;

    virtual int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
    // ......
};

src/communicate/dfnetwork.h

class DFNetWork : public NetWork
{
    // ......
    //  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
    int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
    
    int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
    // ......
};

src/communicate/dfnetwork.cpp

//  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
    return m_oTcpIOThread.AddMessage(iGroupIdx, sIp, iPort, sMessage);
}

int DFNetWork :: SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
    return m_oUDPSend.AddMessage(sIp, iPort, sMessage);
}

src/communicate/tcp/tcp.h

class TcpWrite : public Thread                                                              
{                                                                                                                                                                     
    // ......
    //  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略                                                                                            
    int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
    // ......
}; 

class TcpIOThread 
{
    // ......
    //  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略 
    int AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage);
    // ...... 
};   

src/communicate/tcp/tcp.cpp

//  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int TcpWrite :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
    return m_oTcpClient.AddMessage(sIP, iPort, sMessage);                                                                                                                               
}
// ......
//  64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int TcpIOThread :: AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage)                                                              
{
    int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
    return m_vecTcpWrite[iIndex]->AddMessage(sIP, iPort, sMessage);
} 

src/communicate/tcp/tcp_client.h

class TcpClient
{
    // ......
    // 传递ip和port过程中,带来了一些额外操作
    int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
    // .......                                                                                           
    // 传递ip和port过程中,带来了一些额外操作
    MessageEvent * GetEvent(const std::string & sIP, const int iPort);
    
    MessageEvent * CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort); 
    // ......    
}; 

src/communicate/tcp/tcp_client.cpp

// 传递ip和port过程中,带来了一些额外操作
int TcpClient :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
    //PLImp("ok");
    // 在GetEvent,每次都要从ip和port转换回64位的nodeid
    MessageEvent * poEvent = GetEvent(sIP, iPort);
    if (poEvent == nullptr)
    {   
        PLErr("no event created for this ip %s port %d", sIP.c_str(), iPort);
        return -1; 
    }   

    return poEvent->AddMessage(sMessage);
}

// 传递ip和port过程中,带来了一些额外操作
MessageEvent * TcpClient :: GetEvent(const std::string & sIP, const int iPort)
{
    // 每次都要从ip和port转换回64位的nodeid
    uint32_t iIP = (uint32_t)inet_addr(sIP.c_str());
    uint64_t llNodeID = (((uint64_t)iIP) << 32) | iPort;

    std::lock_guard<std::mutex> oLockGuard(m_oMutex);

    auto it = m_mapEvent.find(llNodeID);
    if (it != end(m_mapEvent))
    {   
        return it->second;
    }   

    return CreateEvent(llNodeID, sIP, iPort);
}

MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort)
{
    PLImp("start, ip %s port %d", sIP.c_str(), iPort);

    Socket oSocket;
    oSocket.setNonBlocking(true);
    oSocket.setNoDelay(true);
    SocketAddress oAddr(sIP, iPort);
    oSocket.connect(oAddr);

    MessageEvent * poEvent = new MessageEvent(MessageEventType_SEND, oSocket.detachSocketHandle(), 
            oAddr, m_poEventLoop, m_poNetWork);
    assert(poEvent != nullptr);

    m_mapEvent[llNodeID] = poEvent;
    m_vecEvent.push_back(poEvent);

    PLImp("ok, ip %s port %d", sIP.c_str(), iPort);

    return poEvent;
}

src/communicate/udp.h

class UDPSend : public Thread
{
    // ......
    // 传递ip和port过程中,带来了一些额外操作
    int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);

    struct QueueData
    {
        std::string m_sIP;
        int m_iPort;
        std::string m_sMessage;
    };

private:
    void SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
    // ......
};

src/communicate/udp.cpp

void UDPSend :: SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
    // 每次都要从ip转换回nodeid的高32位
    struct sockaddr_in addr;
    int addr_len = sizeof(struct sockaddr_in);
    memset(&addr, 0, sizeof(addr));
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(iPort);
    addr.sin_addr.s_addr = inet_addr(sIP.c_str());
    
    int ret = sendto(m_iSockFD, sMessage.data(), (int)sMessage.size(), 0, (struct sockaddr *)&addr, addr_len);
    if (ret > 0)
    {   
        BP->GetNetworkBP()->UDPRealSend(sMessage);
    }
}

void UDPSend :: run()
{
    m_bIsStarted = true;
    
    while(true)
    {   
        QueueData * poData = nullptr;
        
        m_oSendQueue.lock();
        
        bool bSucc = m_oSendQueue.peek(poData, 1000);
        if (bSucc)
        {   
            m_oSendQueue.pop();
        }
        
        m_oSendQueue.unlock();
        
        if (poData != nullptr)
        {
            // 在SendMessage中, 每次都要从ip转换回nodeid的高32位 
            SendMessage(poData->m_sIP, poData->m_iPort, poData->m_sMessage);
            delete poData;
        }
        
        if (m_bIsEnd)
        {   
            PLHead("UDPSend [END]");
            return;
        }
    }
}

int UDPSend :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
    m_oSendQueue.lock();

    if ((int)m_oSendQueue.size() > UDP_QUEUE_MAXLEN)
    {
        BP->GetNetworkBP()->UDPQueueFull();
        //PLErr("queue length %d too long, can't enqueue", m_oSendQueue.size());

        m_oSendQueue.unlock();

        return -2;
    }

    // 拷贝ip和port,最少需要拷贝9个字节(合法的ip字符串最少需要7个字符,类型为int的port最少需要2个字节),ip字符串还有一些构造函数和析构函数的开销。拷贝64为nodeid,只需要8字节
    QueueData * poData = new QueueData;
    poData->m_sIP = sIP;
    poData->m_iPort = iPort;
    poData->m_sMessage = sMessage;

    m_oSendQueue.add(poData);
    m_oSendQueue.unlock();

    return 0;
}

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

class Communicate : public MsgTransport                                                     
{                                                                                           
    // ......
    /*                                                                              
    int Send(const int iGroupIdx, const nodeid_t iNodeID,                                                                                                                               
            const NodeInfo & tNodeInfo, const std::string & sMessage, const int iSendType);
    */

    // 修改代码
    int Send(const int iGroupIdx, const nodeid_t iNodeID,                                                                                                                               
            const std::string & sMessage, const int iSendType);

    // ......                                                                 
};  

src/communicate/communicate.cpp

/*
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID, 
        const NodeInfo & oNodeInfo, const std::string & sMessage, const int iSendType)
*/
// 修改代码
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID, 
        const std::string & sMessage, const int iSendType)
{
    if ((int)sMessage.size() > MAX_VALUE_SIZE)
    {   
        BP->GetNetworkBP()->SendRejectByTooLargeSize();
        PLGErr("Message size too large %zu, max size %u, skip message", 
                sMessage.size(), MAX_VALUE_SIZE);
        return 0;
    }   

    BP->GetNetworkBP()->Send(sMessage);
        
    if (sMessage.size() > m_iUDPMaxSize || iSendType == Message_SendType_TCP)
    {   
        BP->GetNetworkBP()->SendTcp(sMessage);
        // return m_poNetwork->SendMessageTCP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
        // 修改代码
        return m_poNetwork->SendMessageTCP(iGroupIdx, iNodeID, sMessage);
    }   
    else
    {   
        BP->GetNetworkBP()->SendUdp(sMessage);
        // return m_poNetwork->SendMessageUDP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
        // 修改代码
        return m_poNetwork->SendMessageUDP(iGroupIdx, iNodeID, sMessage);
    }   
}

int Communicate :: SendMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage, const int iSendType)
{
    // return Send(iGroupIdx, iSendtoNodeID, NodeInfo(iSendtoNodeID), sMessage, iSendType);
    // 修改代码
    return Send(iGroupIdx, iSendtoNodeID, sMessage, iSendType);
}

int Communicate :: BroadcastMessage(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::set<nodeid_t> & setNodeInfo = m_poConfig->GetSystemVSM()->GetMembershipMap();
        
    for (auto & it : setNodeInfo)
    {   
        if (it != m_iMyNodeID)
        {   
            // Send(iGroupIdx, it, NodeInfo(it), sMessage, iSendType);
            // 修改代码
            Send(iGroupIdx, it, sMessage, iSendType);
        }   
    }   

    return 0;
}

int Communicate :: BroadcastMessageFollower(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::map<nodeid_t, uint64_t> & mapFollowerNodeInfo = m_poConfig->GetMyFollowerMap(); 
        
    for (auto & it : mapFollowerNodeInfo)
    {
        if (it.first != m_iMyNodeID)
        {
            // Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
            // 修改代码
            Send(iGroupIdx, it.first, sMessage, iSendType);
        }
    }
    
    PLGDebug("%zu node", mapFollowerNodeInfo.size());

    return 0;
}

int Communicate :: BroadcastMessageTempNode(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
    const std::map<nodeid_t, uint64_t> & mapTempNode = m_poConfig->GetTmpNodeMap(); 
    
    for (auto & it : mapTempNode)
    {
        if (it.first != m_iMyNodeID)
        {
            Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
            // 修改代码
            Send(iGroupIdx, it.first, sMessage, iSendType);
        }
    }
    
    PLGDebug("%zu node", mapTempNode.size());

    return 0;
}

include/phxpaxos/network.h

class NetWork
{
    // ......
    /*
    virtual int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;

    virtual int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
    */

    // 修改代码
    virtual int SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID const std::string & sMessage) = 0;

    virtual int SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage) = 0;
    // ......
};

src/communicate/dfnetwork.h

class DFNetWork : public NetWork
{
    // ......
    /*
    int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
    
    int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
    */

    // 修改代码
    int SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage);
    
    int SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage);
    // ......
};

src/communicate/dfnetwork.cpp

/*
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
    return m_oTcpIOThread.AddMessage(iGroupIdx, sIp, iPort, sMessage);
}

int DFNetWork :: SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
    return m_oUDPSend.AddMessage(sIp, iPort, sMessage);
}
*/

// 修改代码
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
    return m_oTcpIOThread.AddMessage(iGroupIdx, iSendtoNodeID, sMessage);
}

int DFNetWork :: SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
    return m_oUDPSend.AddMessage(iSendtoNodeID, sMessage);

src/communicate/tcp/tcp.h

class TcpWrite : public Thread                                                              
{                                                                                                                                                                     
    // ......                                                                                          
    // int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
    // 修改代码
    int AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage);
    // ......
}; 

class TcpIOThread 
{
    // ......
    // int AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage);
    // 修改代码
    int AddMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID,  const std::string & sMessage);
    // ...... 
};   

src/communicate/tcp/tcp.cpp

/*
int TcpWrite :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
    return m_oTcpClient.AddMessage(sIP, iPort, sMessage);                                                                                                                               
}
*/

// 修改代码
int TcpWrite :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
    return m_oTcpClient.AddMessage(iSendtoNodeID, sMessage);                                                                                                                               
}

// ......
/*
int TcpIOThread :: AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage)                                                              
{
    int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
    return m_vecTcpWrite[iIndex]->AddMessage(sIP, iPort, sMessage);
} 
*/

// 修改代码
int TcpIOThread :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)                                                              
{
    int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
    return m_vecTcpWrite[iIndex]->AddMessage(iSendtoNodeID, sMessage);
} 

src/communicate/tcp/tcp_client.h

class TcpClient
{
    // ......
    // int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
    // 修改代码
    int AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage);
    // .......                                                                                           
    // MessageEvent * GetEvent(const std::string & sIP, const int iPort);
    
    // MessageEvent * CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort); 
    // 修改代码
    MessageEvent * GetEvent(const nodeid_t iSendtoNodeID);

    MessageEvent * CreateEvent(const uint64_t llNodeID);                   
    // ......    
}; 

src/communicate/tcp/tcp_client.cpp

// int TcpClient :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
int TcpClient :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
    //PLImp("ok");
    // MessageEvent * poEvent = GetEvent(sIP, iPort);
    // 修改代码
    MessageEvent * poEvent = GetEvent(iSendtoNodeID);
    if (poEvent == nullptr)
    {   
        // PLErr("no event created for this ip %s port %d", sIP.c_str(), iPort);
        // 修改代码
        PLErr("no event created for this nodeid %" PRIu64 "", iSendtoNodeID);
        return -1; 
    }   

    return poEvent->AddMessage(sMessage);
}

// MessageEvent * TcpClient :: GetEvent(const std::string & sIP, const int iPort)
// 修改代码
MessageEvent * TcpClient :: GetEvent(const nodeid_t llNodeID)
{
    /*
    uint32_t iIP = (uint32_t)inet_addr(sIP.c_str());
    uint64_t llNodeID = (((uint64_t)iIP) << 32) | iPort;
    */

    std::lock_guard<std::mutex> oLockGuard(m_oMutex);

    auto it = m_mapEvent.find(llNodeID);
    if (it != end(m_mapEvent))
    {   
        return it->second;
    }

    // 修改代码
    return CreateEvent(llNodeID);
}

// MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort)
// 修改代码
MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID)
{
    // PLImp("start, ip %s port %d", sIP.c_str(), iPort);
    // 修改代码
    PLImp("start, nodeid %" PRIu64 "", llNodeID);

    Socket oSocket;
    oSocket.setNonBlocking(true);
    oSocket.setNoDelay(true);
    // SocketAddress oAddr(sIP, iPort);
    // 修改代码

    sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(llNodeID & 0xffffffff);
    addr.sin_addr.s_addr = llNodeID >> 32;
    SocketAddress oAddr(addr);

    oSocket.connect(oAddr);

    MessageEvent * poEvent = new MessageEvent(MessageEventType_SEND, oSocket.detachSocketHandle(), 
            oAddr, m_poEventLoop, m_poNetWork);
    assert(poEvent != nullptr);

    m_mapEvent[llNodeID] = poEvent;
    m_vecEvent.push_back(poEvent);

    // PLImp("ok, ip %s port %d", sIP.c_str(), iPort);
    // 修改代码
    PLImp("ok, nodeid %" PRIu64 "", llNodeID);

    return poEvent;
}

src/communicate/udp.h

class UDPSend : public Thread
{
    // ......
 /*
    int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);

    struct QueueData
    {
        std::string m_sIP;
        int m_iPort;
        std::string m_sMessage;
    };

private:
    void SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
*/

// 修改代码
    int AddMessage(const nodeid_t llNodeID, const std::string & sMessage);

    struct QueueData
    {
        nodeid_t m_llNodeID;
        std::string m_sMessage;
    };

private:
    void SendMessage(const nodeid_t llNodeID, const std::string & sMessage);   

};

src/communicate/udp.cpp

// void UDPSend :: SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
void UDPSend :: SendMessage(const nodeid_t llNodeID, const std::string & sMessage)
{
    struct sockaddr_in addr;
    int addr_len = sizeof(struct sockaddr_in);
    memset(&addr, 0, sizeof(addr));

    // 新增代码
    int iPort = llNodeID & (0xffffffff);
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(iPort);
    // addr.sin_addr.s_addr = inet_addr(sIP.c_str());
    // 修改代码
     addr.sin_addr.s_addr = llNodeID >> 32;
    
    int ret = sendto(m_iSockFD, sMessage.data(), (int)sMessage.size(), 0, (struct sockaddr *)&addr, addr_len);
    if (ret > 0)
    {   
        BP->GetNetworkBP()->UDPRealSend(sMessage);
    }
}

void UDPSend :: run()
{
    m_bIsStarted = true;
    
    while(true)
    {   
        QueueData * poData = nullptr;
        
        m_oSendQueue.lock();
        
        bool bSucc = m_oSendQueue.peek(poData, 1000);
        if (bSucc)
        {   
            m_oSendQueue.pop();
        }
        
        m_oSendQueue.unlock();
        
        if (poData != nullptr)
        { 
            // SendMessage(poData->m_sIP, poData->m_iPort, poData->m_sMessage);
            // 修改代码
            SendMessage(poData->m_llNodeID, poData->m_sMessage);
            delete poData;
        }
        
        if (m_bIsEnd)
        {   
            PLHead("UDPSend [END]");
            return;
        }
    }
}

// int UDPSend :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
int UDPSend :: AddMessage(const nodeid_t llNodeID, const std::string & sMessage)
{
    m_oSendQueue.lock();

    if ((int)m_oSendQueue.size() > UDP_QUEUE_MAXLEN)
    {
        BP->GetNetworkBP()->UDPQueueFull();
        //PLErr("queue length %d too long, can't enqueue", m_oSendQueue.size());

        m_oSendQueue.unlock();

        return -2;
    }

    QueueData * poData = new QueueData;
    /*
    poData->m_sIP = sIP;
    poData->m_iPort = iPort;
    */
    // 修改代码
    poData->m_llNodeID = llNodeID;

    poData->m_sMessage = sMessage;

    m_oSendQueue.add(poData);
    m_oSendQueue.unlock();

    return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions