OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4761|回复: 6

UDP服务端netconn编程只接受到客户端数据,不能发出到客户端

[复制链接]

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2021-3-8
在线时间
41 小时
发表于 2021-4-20 11:34:56 | 显示全部楼层 |阅读模式
1金钱
       做UDP实验,程序里只绑定 err = (OS_ERR)netconn_bind(udpconn,IP_ADDR_ANY,UDP_DEMO_PORT); 没有调用链接远端IP和远端端口。用UDP调试助手发数据,只能接收到数据,服务端发不出数据。。网上看了一些资料说UDP不是连接的,收到数据后应该可以原路发出来数据才对,用抓包工具发现,服务端收到数据后也发出来了,只是发出的目标ip和端口全部变成0了,所以调试助手收不到数据。。怎么返回的目标变成0,UDP难道一定要连接远端IP才能点对点通讯吗、有没有其他方式可以收到那个IP数据就返回到那个ip的方式?

最佳答案

查看完整内容[请看2#楼]

在网上搜索了很多,找到一个网友的解决方法可以解决服务端接收远端数据后,再把应答发送到远端。NETCONN编辑接口中,有一个获取IP和端口的API(netconn_getaddr(udpconn, &destipaddr, &remote_port, 0); //获取远端IP)不知道为什么在接收后调用这个API获取出来的IP是0;网友使用另外两个获取到远端IP和port, addr = netbuf_fromaddr(recvbuf); remote_port = netbuf_fromport(recvbuf); 再在接收后连接到端口和IP就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2021-3-8
在线时间
41 小时
 楼主| 发表于 2021-4-20 11:34:57 | 显示全部楼层
在网上搜索了很多,找到一个网友的解决方法可以解决服务端接收远端数据后,再把应答发送到远端。NETCONN编辑接口中,有一个获取IP和端口的API(netconn_getaddr(udpconn, &destipaddr, &remote_port, 0);        //获取远端IP)不知道为什么在接收后调用这个API获取出来的IP是0;网友使用另外两个获取到远端IP和port,                addr = netbuf_fromaddr(recvbuf);
remote_port = netbuf_fromport(recvbuf);  再在接收后连接到端口和IP就可以了
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-4-20 11:41:53 | 显示全部楼层
UDP是无连接的,得不到远方的IP
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2021-3-8
在线时间
41 小时
 楼主| 发表于 2021-4-20 11:51:16 | 显示全部楼层
bin133 发表于 2021-4-20 11:41
UDP是无连接的,得不到远方的IP

他接收到远端ip,协议栈内部不会获取到远端ip和端口吗?我在接收数据后调用了一个获取IP的函数,想把他手动发送的时候连接上获取的远端ip,发现获取不出来获取也是0
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-4-20 12:26:58 | 显示全部楼层
协议也获取不到UDP的远端IP的,他们无连接的
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-4-20 20:29:36 | 显示全部楼层
使用udp_recv注册UDP接收回调函数,然后就能获取到数据的同时知道是谁发来的了:
最后两个参数就是对方的IP和端口。

udp_recv(pcb , udpecho_raw_recv, pcb);

static void udpecho_raw_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
        LWIP_UNUSED_ARG(arg);
        if(p == NULL)
                return;
       
        udp_sendto(pcb, p, addr, port);
        pbuf_free(p);
}
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2021-3-8
在线时间
41 小时
 楼主| 发表于 2021-4-21 08:35:19 | 显示全部楼层
xkwy 发表于 2021-4-20 20:29
使用udp_recv注册UDP接收回调函数,然后就能获取到数据的同时知道是谁发来的了:
最后两个参数就是对方的I ...

感谢分享,我用NETCONN接口在接收数据后调用netbuf_fromaddr(recvbuf);netbuf_fromport(recvbuf);也获取到了ip和端口,在发送数据的时候连接到IP和端口
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表