OpenEdv-开源电子网

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

uip udp遇到的问题,求助开发过udp的朋友。

[复制链接]

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-11-29
在线时间
1 小时
发表于 2013-12-17 16:48:05 | 显示全部楼层 |阅读模式



电脑端ip:192.168.17.182 port:8080
设备端ip:192.168.17.198 port:1800

我要使用stm32战舰板做一个设备,功能需求描述如下:设备使用UDP与电脑连接,电脑通过固定端口8080,主动发任意数据给设备的1800端口。设备使用固定端口1800把数据原样返回给电脑的8080端口。

经过移植测试,发现没有达到设计要求。测试界面如图所示。电脑使用8080端口给设备发信息,设备的1800端口能正常接收到,但是设备不使用1800端口给电脑回信息,而是随机分配一个新的端口,这个在下面程序中我会说明原因。经过10次通讯后,设备没有新的udp连接可以建立(因为UDP连接最多只有10个),通讯也就中断了。请高手帮我如何才能让设备只通过一个UDP连接进行通讯,也就是只是用1800端口进行收和发?
main函数中的初始化代码:
  uip_ipaddr(ipaddr, 192,168,17,198); //设备IP
uip_sethostaddr(ipaddr);    
uip_ipaddr(ipaddr, 192,168,17,254); //网管
uip_setdraddr(ipaddr);  
uip_ipaddr(ipaddr, 255,255,255,0); //子网掩码
uip_setnetmask(ipaddr);

uip_udp_bind(&uip_udp_conns[0],HTONS(1800));//创建一个udp连接在uip_udp_conns【0】位置,绑定端口1800,随时监听电脑发来的数据。

//UDP服务回调函数(UIP_UDP_APPCALL)

void udp_demo_appcall(void)
{
switch(uip_udp_conn->lport)        //检查发来的数据包的端口。
{
case HTONS(1800):
udp_phone_appcall(); //调用1800端口的数据回调函数。
break;
default:  
   break;
}

}
void udp_phone_appcall(void)
{
uip_ipaddr_t ipaddr;
if(uip_newdata())        //有新数据
{
strcpy((char*)udp_server_databuf,uip_appdata);//将udp数据部分拷贝到我的数组udp_server_databuf【】
udp_server_sta|=1<<6;//有新数据标志

ipaddr[0] = UDPBUF->srcipaddr[0];//将我的电脑的IP地址保存起来。
ipaddr[1] = UDPBUF->srcipaddr[1];


uip_udp_conn = uip_udp_new(&ipaddr,UDPBUF->srcport);//建立一个到我的电脑的连接,端口是我的电脑发送时使用的端口。这里设备会自动给自己分配一个端口,用来发数据。而不是我要求的固定的1800端口。

uip_udp_send(uip_len);

}
}


同志们,朋友们,问题该怎么解决啊?在线等你们回复啊。





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-11-29
在线时间
1 小时
 楼主| 发表于 2013-12-18 11:23:57 | 显示全部楼层




我的帖子不能沉下来啊。我这样修改了一下,虽然不能达到最终要求,还算有了进步。
在主函数中限定目标地址和端口在一个连接uip_udp_conns[0]中。

uip_udp_bind(&uip_udp_conns[0],HTONS(1800));//°ó?¨UDP??????
uip_udp_conns[0].rport = HTONS(8080);//目标端口
uip_ipaddr(ipaddr, 192,168,17,182); //目标IP
uip_ipaddr_copy(uip_udp_conns[0].ripaddr, ipaddr);
回调函数中不再建立新的连接。直接发送收到的数据。
void udp_phone_appcall(void)
{
uip_ipaddr_t ipaddr;
if(uip_newdata())
{
strcpy((char*)udp_server_databuf,uip_appdata);
udp_server_sta|=1<<6;//±í?????????§??????

//  ipaddr[0] = UDPBUF->srcipaddr[0];
//  ipaddr[1] = UDPBUF->srcipaddr[1];


//  uip_udp_conn = uip_udp_new(&ipaddr,UDPBUF->srcport);

uip_udp_send(uip_len);

}

}

求高手关注。指点。
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-11-29
在线时间
1 小时
 楼主| 发表于 2013-12-19 17:17:10 | 显示全部楼层
又沉了,我顶。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-19 23:39:35 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2014-12-22 16:11:57 | 显示全部楼层
力顶,同事希望版主 分享代码,一起进步
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2015-10-22
在线时间
2 小时
发表于 2016-11-29 10:42:40 | 显示全部楼层
力顶
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 16:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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