⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sipagent.cxx

📁 一个SIP协议栈
💻 CXX
字号:
#include "SIPAgent.h"namespace msip{    //---------------------------------------------------------------------------------------    Agent::Agent(int udp_port, int tcp_port)    : ag_Receiver(udp_port, tcp_port)    {    }    //---------------------------------------------------------------------------------------    Agent::~Agent()    {        TransArray::iterator it;        for(it = ag_Transmitters.begin(); it != ag_Transmitters.end(); ++it)        {            if(*it) delete *it;        }    }    //---------------------------------------------------------------------------------------    bool     Agent::poll(fd_set* fds)    {        TransArray::iterator it;        for(it = ag_Transmitters.begin(); it != ag_Transmitters.end(); ++it)        {            if(*it)             {                if((*it)->m_retrans.poll() == RetransmitManager::trTransmitIndicated)                {                    (*it)->m_trans.send((*it)->m_buffer);                }            }        }        return ag_Receiver.poll(fds);    }    //---------------------------------------------------------------------------------------    TransmitID     Agent::connect(SendVia via, const std::string & addr, int port)    {        int i;        for(i = 0; i < ag_Transmitters.size(); ++i)        {            if(ag_Transmitters[i] == 0) break;        }        if(i >= ag_Transmitters.size())        {            ag_Transmitters.push_back(0);            i = ag_Transmitters.size() - 1;        }        ag_Transmitters[i] = new TransmitItem;        ag_Transmitters[i]->m_trans.connect(via, addr, port);        return TransmitID(i);    }        //---------------------------------------------------------------------------------------    void     Agent::setTimeoutValues(TransmitID connection, long t1, long t2, double exp_val)    {        if(connection >= 0 && connection < ag_Transmitters.size())        {            if(ag_Transmitters[connection])             {                ag_Transmitters[connection]->m_retrans.setTimeoutValues(t1, t2, exp_val);            }        }    }    //---------------------------------------------------------------------------------------    bool     Agent::send(TransmitID connection, /*const*/ Message& msg, bool retry_flag)    {        if(connection < 0 || connection >= ag_Transmitters.size()) return false;        if(ag_Transmitters[connection] == 0) return false;        ag_Transmitters[connection]->m_buffer = msg.encode();        ag_Transmitters[connection]->m_retrans.start();        ag_Transmitters[connection]->m_trans.send(ag_Transmitters[connection]->m_buffer);        return true;    }            //---------------------------------------------------------------------------------------    void     Agent::stopRetransmit(TransmitID connection)    {        if(connection >= 0 && connection < ag_Transmitters.size())        {            if(ag_Transmitters[connection])             {                ag_Transmitters[connection]->m_retrans.cancel();            }        }    }            //---------------------------------------------------------------------------------------    bool     Agent::send(SendVia via, /*const*/ Message& msg, const std::string & addr, int port) const    {        Transmitter trans;        if(trans.connect(via, addr, port))        {            trans.send(msg.encode());            trans.close();            return true;        }        return false;    }    //---------------------------------------------------------------------------------------    bool     Agent::close(TransmitID connection)    {        if(connection >= 0 && connection < ag_Transmitters.size())        {            if(ag_Transmitters[connection])             {                delete ag_Transmitters[connection];                ag_Transmitters[connection] = 0;            }        }    }    //---------------------------------------------------------------------------------------    long     Agent::getMinimalTimeLeft(long min_time_left) const    {        if(notEmpty()) return 0l;        long tm_left;        TransArray::const_iterator it;        for(it = ag_Transmitters.begin(); it != ag_Transmitters.end(); ++it)        {            if(*it)            {                tm_left = (*it)->m_retrans.getTimeLeft();                if(tm_left < min_time_left) min_time_left = tm_left;            }        }        return min_time_left;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -