天线|RF射频
直播中

刘宇

7年用户 225经验值
私信 关注
[问答]

请问用lwip能在程序中同时实现tcp客户端,tcp服务器及udp的功能吗?

用lwip能否在程序中同时实现tcp客户端,tcp服务器及udp的功能?有实现的请发一下源码,不能发源码的请说一下实现的方式方法,三种功能单独的都已经实现了,但是不知道怎么合并,自己试着合并了一下发现还是只能实现其中一种功能

回帖(6)

h1654156194.5000

2020-3-16 09:37:01
实现了,但是当作为tcp客户端时因为要主动向服务器发起连接,服务器端需要提前开启。或者加个定时器进行定时连接或者在下面的if(t=200)后的大括号中加上连接服务器的语句,这样服务器端随时开启板子都能连上了@发烧友       谢谢原子哥帮顶
举报

周蓓

2020-3-16 09:49:00
请知道的不吝赐教,非常感谢
举报

刘翔宇

2020-3-16 10:00:02
帮顶
举报

古贤睦

2020-3-16 10:07:52
[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);}}
举报

更多回帖

×
20
完善资料,
赚取积分