看代码,4.11版本。当多个cudt共用同个复用器时,发送和接收的buffer也是共用的,即cudt的m_pSndQueue相同。
见CUDTUnited::updateMux()
if ((s->m_pUDT->m_bReuseAddr) && (NULL != addr))
{
int port = (AF_INET == s->m_pUDT->m_iIPversion) ? ntohs(((sockaddr_in)addr)->sin_port) : ntohs(((sockaddr_in6)addr)->sin6_port);
// find a reusable addressfor(map<int,CMultiplexer>::iteratori=m_mMultiplexer.begin();i!=m_mMultiplexer.end();++i){if((i->second.m_iIPversion==s->m_pUDT->m_iIPversion)&&(i->second.m_iMSS==s->m_pUDT->m_iMSS)&&i->second.m_bReusable){if(i->second.m_iPort==port){// reuse the existing multiplexer++i->second.m_iRefCount;s->m_pUDT->m_pSndQueue=i->second.m_pSndQueue;s->m_pUDT->m_pRcvQueue=i->second.m_pRcvQueue;s->m_iMuxID=i->second.m_iID;return;}}}
看代码,4.11版本。当多个cudt共用同个复用器时,发送和接收的buffer也是共用的,即cudt的m_pSndQueue相同。
见CUDTUnited::updateMux()
if ((s->m_pUDT->m_bReuseAddr) && (NULL != addr))
{
int port = (AF_INET == s->m_pUDT->m_iIPversion) ? ntohs(((sockaddr_in)addr)->sin_port) : ntohs(((sockaddr_in6)addr)->sin6_port);
}
有个疑问.
在发送线程CSndQueue::worker()中,是针对cudt进行包封装的(CUDT::packData())。取数据调用m_pSndBuffer->readData()。
从m_pSndBuffer取出来的包不一定是属于当前cudt的包吧?但这时候使用的是cudt的拥塞窗口。
简洁一点就是当多个cutd共用同个复用器时,发送线程在处理某个cudt的发送时发送了另外cudt的包了。