null9102 2022-10-13 16:51 采纳率: 100%
浏览 103
已结题

socket udp recvfrom 接收的字符数据长度远小于返回值

socket udp recvfrom 接收的字符数据长度远小于返回值
用代码块功能插入代码,请勿粘贴截图

#define BUF_MAX_SIZE    220*1024

int createUdpSocket(char *ip, int port)
{
    int sockfd;
    int on = 1;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
        return -1;

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));

    struct sockaddr_in  addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port); 
    if (NULL == ip)
    {
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
    }
    else
    {
        addr.sin_addr.s_addr = inet_addr(ip);
    }
   
    if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0)
    {
        rl_log_err("connect failed, exit !\n");
        return -1;
    }
    
    return sockfd;
}

static void* Rtsp_forward_thread(void *arg)
{
   ……
    int sockfd;
    int rtpSockfd, rtcpSockfd;

    ……
    int port = 55532;
    rtpSockfd = createUdpSocket(NULL, port);
    if (rtpSockfd < 0)
    {
        rl_log_err("create rtpSocket failed!");
        pthread_detach(pthread_self());
        return NULL;
    }
    rtspInfo.rtp_port = get_sock_port(rtpSockfd);
    if (rtspInfo.rtp_port < 0)
    {
        rl_log_err("get rtp port failed!");
        pthread_detach(pthread_self());
        return NULL;
    }

    //设置超时
    struct timeval timeout={1,0};
    setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));

    int n = 220 * 1024;
    setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));

    char* rBuf = (char*)malloc(BUF_MAX_SIZE);
    if (rtspInfo.isTcp)
    {
        ……
    } else {
        struct sockaddr serverAddr;
        int len  = sizeof(serverAddr);
        struct sockaddr_in servaddr;
        memset(&servaddr, 0, sizeof(servaddr) );
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = inet_addr("XXX.XXX.XXX.XXX");
        servaddr.sin_port = htons(60590);
        char *tmp = NULL;
        while (1)
        {
            rl_memset(rBuf, 0, BUF_MAX_SIZE);
            ret = recvfrom(rtpSockfd, rBuf, BUF_MAX_SIZE, 0, (struct sockaddr *)&serverAddr, &len);
            rl_log_info("recv rtp buf ret %d  rbuf %d \n", ret, strlen(rBuf));
        }
    }
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

尝试增大buff缓冲区
#define BUF_MAX_SIZE 220*1024

setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));

没有效果

我想要达到的结果

接收数据长度和返回值一致

  • 写回答

2条回答 默认 最新

  • Ubabi_? 2022-10-13 20:16
    关注

    你好,不知道你传输的是什么内容呢,个人推测可能是传输的内容中包含'\0',以至于strlen计算字符串长度时提前结束了,导致长度与返回值不一致

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 赞助了问题酬金15元 10月13日
  • 赞助了问题酬金1元 10月13日
  • 展开全部

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan