jrtplib can't retrieve login name解决方案
  3cAxQ5E22S4z 2023年11月02日 107 0

场景

          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
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
3cAxQ5E22S4z