完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用lwip能否在程序中同时实现tcp客户端,tcp服务器及udp的功能?有实现的请发一下源码,不能发源码的请说一下实现的方式方法,三种功能单独的都已经实现了,但是不知道怎么合并,自己试着合并了一下发现还是只能实现其中一种功能
|
|
相关推荐
6个回答
|
|
实现了,但是当作为tcp客户端时因为要主动向服务器发起连接,服务器端需要提前开启。或者加个定时器进行定时连接或者在下面的if(t=200)后的大括号中加上连接服务器的语句,这样服务器端随时开启板子都能连上了@发烧友 谢谢原子哥帮顶
|
|
|
|
请知道的不吝赐教,非常感谢
|
|
|
|
|
|
[C] 纯文本查看 复制代码
#include "sys.h"#include "string.h" #include "delay.h"#include "usart.h"#include "dma.h"#include "led.h"#include "key.h"#include "lwip_comm.h"#include "LAN8720.h"#include "timer.h"#include "sram.h"#include "malloc.h"#include "lwip/netif.h"#include "lwip_comm.h"#include "lwipopts.h"#include "tcp_server_demo.h"#include "tcp_client_demo.h"#include "udp_demo.h"int main(void){u8 speed;delay_init(168); //延时初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置MYDMA_Config(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)uart_recbuf,uart_recbufsize);uart_init(115200); //串口波特率设置LED_Init(); //LED初始化mymem_init(SRAMIN);//初始化内部内存池mymem_init(SRAMCCM);//初始化CCM内存池TIM3_Int_Init(999,839); //100khz的频率,计数1000为10mswhile(lwip_comm_init()) //lwip初始化{printf("LWIP Init Falied!rn");delay_ms(1200);printf("Retrying...rn"); }printf("LWIP Init Success!rn");#if LWIP_DHCPwhile((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出{lwip_periodic_handle();}#endifspeed=LAN8720_Get_Speed();//得到网速if(speed&1<<1)printf("Ethernet Speed:100Mrn");else printf("Ethernet Speed:10Mrn");printf("PORT: 8089rn");delay_ms(500);//延时1sdelay_ms(500);while(1){ u8 i;u8 res=0;u8 t=0; err_t err; struct ip_addr locipaddr; struct ip_addr rmtipaddr; //远端ip地址IP4_ADDR(&locipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]); struct udp_pcb *udppcb; //struct tcp_pcb *tcppcbclient; //定义一个TCP服务器控制块struct tcp_pcb *tcppcbserver; //定义一个TCP服务器控制块struct tcp_pcb *tcppcbconn; //定义一个TCP服务器控制块udppcb=udp_new();tcppcbclient=tcp_new();//创建一个新的pcbtcppcbserver=tcp_new();//创建一个新的pcb#if 1if(udppcb)//创建成功{ err=udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT);//UDP客户端连接到指定IP地址和端口号的服务器if(err==ERR_OK){err=udp_bind(udppcb,&locipaddr,UDP_DEMO_PORT);//绑定本地IP地址与端口号if(err==ERR_OK)//绑定完成{udp_recv(udppcb,udp_demo_recv,NULL);//注册接收回调函数 udp_demo_flag |= 1<<5;//标记已经连接上}else res=1;}else res=1;}else res=1;#endif#if 0if(tcppcbclient)//创建成功{tcp_connect(tcppcbclient,&rmtipaddr,REMOTE_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数}else res=1;#endif#if 1if(tcppcbserver)//创建成功{ err=tcp_bind(tcppcbserver,&locipaddr,TCP_SERVER_PORT);//将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址if(err==ERR_OK)//绑定完成{tcppcbconn=tcp_listen(tcppcbserver); //设置tcppcb进入监听状态tcp_accept(tcppcbconn,tcp_server_accept); //初始化LWIP的tcp_accept的回调函数}else res=1; }else res=1;#endifwhile(res==0){if(udp_demo_flag&1<<6){for(i=0;i<=udptotal_len;i++) { USART_SendData(USART1, udp_demo_recvbuf); //向串口2发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}udptotal_len=0;udp_demo_flag&=~(1<<6);//标记数据已经被处理了.} if(tcp_client_flag&1<<6)//是否收到数据{for(i=0;i<=tcpclienttotal_len;i++) {USART_SendData(USART1,tcp_client_recvbuf); //向串口2发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}tcpclienttotal_len=0;tcp_client_flag&=~(1<<6);//标记数据已经被处理了.} if(tcp_server_flag&1<<6){for(i=0;i<=tcpservertotal_len;i++) {USART_SendData(USART1, tcp_server_recvbuf); //向串口2发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}tcpservertotal_len=0;//tcp_server_flag&=~(1<<6);//标记数据已经被处理了.} if(udp_demo_flag&1<<7){udp_demo_senddata(udppcb);udp_demo_flag&=~(1<<7); //清除数据发送标志位}lwip_periodic_handle();delay_ms(2);t++;if(t==200){t=0;LED0=!LED0;} }udp_demo_connection_close(udppcb); //断开udp连接tcp_client_connection_close(tcppcbclient,0);//关闭TCP Client连接tcp_server_connection_close(tcppcbserver,0);//关闭TCP Server连接tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接 tcp_server_remove_timewait(); memset(tcppcbserver,0,sizeof(struct tcp_pcb));memset(tcppcbconn,0,sizeof(struct tcp_pcb)); delay_ms(100);}} |
|
|
|
谢谢分享
|
|
|
|
你有试过,关闭所有控制块再重新打开吗?我测试了,单独开客户端或服务端,都可以关闭再重新打开,但是两个一起开,是可以正常运行,但是一关闭,再重新开,就不行了,无法再开了,程序进入超时里了,而且出现BUG,再里面四循环出不来了。
还有你有测试过大量数据传输吗?板子单独做客户端,电脑做服务器间隔20ms发送1K数据,程序也会死在协议栈里。 这个协议栈用了心不安 |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2547 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2332 浏览 5 评论
3159 浏览 3 评论
2804 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2762 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
610浏览 1评论
855浏览 0评论
970浏览 0评论
623浏览 0评论
449浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 22:20 , Processed in 0.968813 second(s), Total 58, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号