Kernel_Lover

Kernel_Lover

0个粉丝

17

问答

0

专栏

0

资料

Kernel_Lover  发布于  2017-12-08 11:33:26
采纳率 0%
17个问答
3245

recvfrom 函数进入死循环

 
我的代码功能是获取来自自己搭建的流媒体服务器 RTP 数据包,并存储为 H264 文件,程序在 ubuntu 上运行可以正常获取到数据包,之后移植到 hi3536 开发板上,就获取不了数据包了,经过调试发现是卡在 recvfrom 函数上,电脑和开发板可以互相 ping 通,可以通信。

代码片段:

void *proc_udpsocket(void *arg)
{
        printf("into proc_udpsocket function\n");
        int addr_len;
       
        addr_len = sizeof(struct sockaddr_in);                                                        
   
        while((receive_bytes = recvfrom(rtpsockfd, recvbuf, 1500, 0, (struct sockaddr *) &RTPAddr, &addr_len)) > 0)  
            {  
                ....................
        }
        .................
}

调试信息:



我来回答
回答7个
时间排序
认可量排序

Kernel_Lover

0个粉丝

17

问答

0

专栏

0

资料

Kernel_Lover 2017-12-08 15:51:39
认可0
出现的问题:recvfrom 函数进入死循环

原因:用于接收数据包的端口被其它程序所占用

解决方法:kill 掉占用端口的程序

查看端口:netstat -apn | grep "18888" (查看端口 18888 是否被占用)

mengxp

0个粉丝

18

问答

0

专栏

1

资料

mengxp 2017-12-08 17:47:15
认可0
receive_bytes 什么定义?

Kernel_Lover

0个粉丝

17

问答

0

专栏

0

资料

Kernel_Lover 2017-12-11 08:54:42
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81856&ptid=38403]mengxp 发表于 2017-12-8 17:47[/url]
receive_bytes 什么定义?[/quote]

就是接收到的 RTP 数据包的长度

mengxp

0个粉丝

18

问答

0

专栏

1

资料

mengxp 2017-12-11 09:48:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81915&ptid=38403]Kernel_Lover 发表于 2017-12-11 08:54[/url]
就是接收到的 RTP 数据包的长度[/quote]

是int吗?还是unsigned?

Kernel_Lover

0个粉丝

17

问答

0

专栏

0

资料

Kernel_Lover 2017-12-11 10:43:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81925&ptid=38403]mengxp 发表于 2017-12-11 09:48[/url]
是int吗?还是unsigned?[/quote]

执行命令:

man recvfrom

输出的部分信息:

RECV(2)                                                               Linux Programmer's Manual                                                               RECV(2)

NAME
       recv, recvfrom, recvmsg - receive a message from a socket

SYNOPSIS
       #include
       #include

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);


可以看到 recvfrom 函数返回值类型为 ssize_t ,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。遇到函数参数和返回值不确定的问题,可以先使用 man 命令看一下。

mengxp

0个粉丝

18

问答

0

专栏

1

资料

mengxp 2017-12-11 10:46:57
认可0
本帖最后由 mengxp 于 2017-12-11 10:48 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=81933&ptid=38403]Kernel_Lover 发表于 2017-12-11 10:43[/url]
执行命令:

man recvfrom
[/quote]

我知道。我怕你定义错了。定义成unsigned int。
因为你帖子里没提到这个变量的声明。
卡recvfrom就是没数据到来就会卡啊。阻塞模式的recv都是这样的
或者丢包了,没收到数据

Kernel_Lover

0个粉丝

17

问答

0

专栏

0

资料

Kernel_Lover 2017-12-11 11:00:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81934&ptid=38403]mengxp 发表于 2017-12-11 10:46[/url]
我知道。我怕你定义错了。定义成unsigned int。
因为你帖子里没提到这个变量的声明。
卡recvfrom就是 ...[/quote]

哦,谢谢啊!现在我已经解决了,是因为端口被占用的问题,我在2楼贴出了解决方法。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区