xumx - 2013-06-08

谷博士您好,最近使用udt发现我模拟服务端在接收数据的时候偶尔出现点问题,原因
是int CRcvBuffer::readBuffer(char* data, int len)这个方法中偶尔会出现int
unitsize = m_pUnit[p]->m_Packet.getLength() - m_iNotch;这句语句中的
m_pUnit[p]->m_Packet为空指针,导致程序调用错误,问下这个情况是什么原因导致
的,谢谢了,以下是我的一些测试代码。

服务端接收数据代码如下:

while (true)

{

     int iWaitResult = UDT::epoll_wait(eid, &readfds, NULL, 5000);

     if (iWaitResult<0){

               continue;

     }

     for (set<UDTSOCKET>::iterator i = readfds.begin(); i !=

readfds.end(); ++ i)

     {

     nRecvResult = UDT::recv(*i, buffer, MAX_BUF_SIZE, 0);

               if ( nRecvResult <= 0 )

               {

                        int errorcode =

UDT::getlasterror().getErrorCode();

                        printf("sockID:%d Errorcode:%d %s\n", (*i),

errorcode,

                                 UDT::getlasterror_desc());

                        if (errorcode != CUDTException::EASYNCRCV)

                        {

                                 m_Socks.erase(*i);

                                 int ret1 = 0, ret2 = 0;

                                 ret1 = UDT::epoll_remove_usock(eid,

*i);

                                 ret2 = UDT::close(*i);

                                 m_nNumberOfActiveConnections --;

                                 printf("epoll_remove_usock return:%d

close return:%d\n", ret1, ret2);

                        }

                        cout << "Receive:" <<

UDT::getlasterror().getErrorMessage() << endl;

                        continue;

               }

     }

}

客户端模拟使用一个客户端一个线程,开了200个线程,线程中发送代码如下:

DWORD WINAPI UdtDataSend(LPVOID param)

{

     UDTSOCKET usock =*(UDTSOCKET*)param;

     char buffer[MAX_BUF_SIZE];

     memset(buffer,'1',sizeof(buffer));

     int rc = 0;

     while(true)

     {

               rc = UDT::send(usock, buffer, MAX_BUF_SIZE, 0);

     }

     return NULL;

}