UDT中epoll对CLOSE状态的处理(2)

所以,这时候再用getsocketstate取socket的状态,就会取到CLOSED,也就是明明是BROKEN事件,硬生生变成了CLOSED事件!然后接下去epoll事件的移除就失败了。

 

于是,修改如下,

int CEPoll::remove_usock(const int eid, const UDTSOCKET& u)

{

   CGuard pg(m_EPollLock);

 

   map<int, CEPollDesc>::iterator p = m_mPolls.find(eid);

   if (p == m_mPolls.end())

      throw CUDTException(5, 13);

 

   p->second.m_sUDTSocksIn.erase(u);

   p->second.m_sUDTSocksOut.erase(u);

   p->second.m_sUDTSocksEx.erase(u);

 

   return 0;

}

改为

int CEPoll::remove_usock2(const int eid, const UDTSOCKET& u)

{

   CGuard pg(m_EPollLock);

 

   map<int, CEPollDesc>::iterator p = m_mPolls.find(eid);

   if (p == m_mPolls.end())

      throw CUDTException(5, 13);

 

   p->second.m_sUDTSocksIn.erase(u);

   p->second.m_sUDTSocksOut.erase(u);

   p->second.m_sUDTSocksEx.erase(u);

 

   p->second.m_sUDTWrites.erase(u);

   p->second.m_sUDTReads.erase(u);

   p->second.m_sUDTExcepts.erase(u);

 

   return 0;

}

并去掉CUDTUnited::epoll_remove_usock()中对removeEPoll()的调用。

 

这是比较简单也比较粗糙的改法,应该有更方便的思路才对。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e31a482a1ec85d60c5fa3fb7153a6983.html