场景
arm linux版本程序启动调用jrtplib报错如上,导致建立rtpsession失败
原因分析
RTPSession::CreateCNAME 这个函数会从系统调用里获取登陆名称,然后填充RTCP报文中的CNAME字段,但是一般的板子由于内核和文件系统的原因都没有登录名称
int RTPSession::CreateCNAME(uint8_t *buffer,size_t *bufferlength,bool resolve)
{
#ifndef WIN32
bool gotlogin = true;
#ifdef RTP_SUPPORT_GETLOGINR
buffer[0] = 0;
if (getlogin_r((char *)buffer,*bufferlength) != 0)
gotlogin = false;
else
{
if (buffer[0] == 0)
gotlogin = false;
}
if (!gotlogin) // try regular getlogin
{
char *loginname = getlogin();
if (loginname == 0)
gotlogin = false;
else
strncpy((char *)buffer,loginname,*bufferlength);
}
#else
char *loginname = getlogin();
if (loginname == 0)
gotlogin = false;
else
strncpy((char *)buffer,loginname,*bufferlength);
#endif // RTP_SUPPORT_GETLOGINR
if (!gotlogin)
{
char *logname = getenv("LOGNAME");
if (logname == 0)
return ERR_RTP_SESSION_CANTGETLOGINNAME;
strncpy((char *)buffer,logname,*bufferlength);
}
#else // Win32 version
#ifndef _WIN32_WCE
DWORD len = *bufferlength;
if (!GetUserName((LPTSTR)buffer,&len))
RTP_STRNCPY((char *)buffer,"unknown",*bufferlength);
#else
RTP_STRNCPY((char *)buffer,"unknown",*bufferlength);
#endif // _WIN32_WCE
#endif // WIN32
buffer[*bufferlength-1] = 0;
size_t offset = strlen((const char *)buffer);
if (offset < (*bufferlength-1))
buffer[offset] = (uint8_t)'@';
offset++;
size_t buflen2 = *bufferlength-offset;
int status;
if (resolve)
{
if ((status = rtptrans->GetLocalHostName(buffer+offset,&buflen2)) < 0)
return status;
*bufferlength = buflen2+offset;
}
else
{
char hostname[1024];
RTP_STRNCPY(hostname,"localhost",1024); // just in case gethostname fails
gethostname(hostname,1024);
RTP_STRNCPY((char *)(buffer+offset),hostname,buflen2);
*bufferlength = offset+strlen(hostname);
}
if (*bufferlength > RTCP_SDES_MAXITEMLENGTH)
*bufferlength = RTCP_SDES_MAXITEMLENGTH;
return 0;
}
尝试方案
export LOGNAME=root
运行可执行环境
最终方案
强制指定CNAME,直接返回
int RTPSession::CreateCNAME(uint8_t *buffer,size_t *bufferlength,bool resolve)
{
#ifndef WIN32
bool gotlogin = true;
strncpy((char *)buffer, "fengyuzaitu", *bufferlength);
return 0;
#ifdef RTP_SUPPORT_GETLOGINR