天天看點

lwip可以用于發udp_用lwip能否在程式中同時實作tcp用戶端,tcp伺服器及udp的功能?...

[mw_shl_code=c,true]#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為10ms

while(lwip_comm_init()) //lwip初始化

{

printf("LWIP Init Falied!\r\n");

delay_ms(1200);

printf("Retrying...\r\n");

}

printf("LWIP Init Success!\r\n");

#if LWIP_DHCP

while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP擷取成功/逾時溢出

{

lwip_periodic_handle();

}

#endif

speed=LAN8720_Get_Speed();//得到網速

if(speed&1<<1)printf("Ethernet Speed:100M\r\n");

else printf("Ethernet Speed:10M\r\n");

printf("PORT: 8089\r\n");

delay_ms(500);                        //延時1s

delay_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();        //建立一個新的pcb

tcppcbserver=tcp_new();        //建立一個新的pcb

#if  1

if(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  0

if(tcppcbclient)                        //建立成功

{                        tcp_connect(tcppcbclient,&rmtipaddr,REMOTE_PORT,tcp_client_connected);//連接配接到目的位址的指定端口上,當連接配接成功後回調tcp_client_connected()函數

}else res=1;

#endif

#if  1

if(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;

#endif

while(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);

}

}

[/mw_shl_code]