下面代码主要功能是:
接收PC客户端语音包,然后转发给网关;
接收数据包时,使用SNIFFER抓包显示长度为172,
但是实际收到长度为1,并且recvfrom返回长度也是172设置接收数据的超时时间,还是收不到数据;
客户端和网关协商,
支持的音频格式,pt=0(g711.u),pt=101             网关异常日志:
10d:17h:51m:3s (lgr_coders_list)(5696) 
?? [WARNING] ACCodersList::IsMatch found match with different intervals g711Ulaw64k10 (10 != 20)                #ifdef FD_SETSIZE
#undef FD_SETSIZE
#define FD_SETSIZE 1024
#endiffd_set serv_Set;
FD_ZERO(&serv_Set);
FD_SET(udpSckClientToProxy,&serv_Set);
timeval time_Out={200,0}; //设置接收数据的超时时间200ms
int res=select(0,&serv_Set,NULL,NULL,&time_Out);if(res==0 || res==-1)
{ //接收数据超时
TRACE("timeout or error:%d\n",res);
}else if(FD_ISSET(udpSckClientToProxy,&serv_Set))
{
char buf[1024]={0};
bRsLength=recvfrom(udpSckClientToProxy,buf,1024,0,(sockaddr*)&udpAddrHole,&ilength);
CString strIP=inet_ntoa(udpAddrHole.sin_addr); //客户端IP//把语音包转发给网关
}

解决方案 »

  1.   

    char buf[1024]={0}; 
    bRsLength=recvfrom(udpSckClientToProxy,buf,1024,0,(sockaddr*)&udpAddrHole,&ilength); tmp.Empty(); 
    tmp= buf; 
    int k = tmp.GetLength(); bRsLength的值为172,但是k的值为1,很奇怪
      

  2.   

    我以前也有碰到过这个问题.
    把tmp.Empty()这行拿掉,MSDN的说明是将字符串长度设为了0,并不是将字符串内容设为0
    你可以这样:
     把
       tmp.Empty();
       tmp = buf;
     替换为: 
       tmp.Format(_T("%s"),buf);
      

  3.   

    那是因为数据的第二个字符值为0X00,CSTRING在赋值时,只截取了0X00前的字符。如果赋值对象不是字符串,就不要使用CSTRING,更不要这样赋值。