STM32F107_ETH_LwIP_V1.0.0.rar

源代码在线查看: server.c

软件大小: 10647 K
上传用户: z147028571a
关键词: ETH_LwIP_V STM 107
下载地址: 免注册下载 普通下载 VIP

相关代码

				/**
				  ******************************************************************************
				  * @file    server.c
				  * @author  MCD Application Team
				  * @version V1.0.0
				  * @date    11/20/2009
				  * @brief   A sample UDP/TCP server application.
				  ******************************************************************************
				  * @copy
				  *
				  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
				  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
				  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
				  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
				  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
				  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
				  *
				  * © COPYRIGHT 2009 STMicroelectronics
				  */
				
				/* Includes ------------------------------------------------------------------*/
				#include "main.h"
				#include "lwip/pbuf.h"
				#include "lwip/udp.h"
				#include "lwip/tcp.h"
				#include 
				#include 
				
				/* Private typedef -----------------------------------------------------------*/
				/* Private define ------------------------------------------------------------*/
				#define UDP_SERVER_PORT    7   /* define the UDP local connection port */
				#define UDP_CLIENT_PORT    4   /* define the UDP remote connection port */
				#define TCP_PORT    4	/* define the TCP connection port */
				
				/* Private macro -------------------------------------------------------------*/
				/* Private variables ---------------------------------------------------------*/
				/* Private function prototypes -----------------------------------------------*/
				void udp_server_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port);
				err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb, err_t err);
				static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
				
				/* Private functions ---------------------------------------------------------*/
				
				/**
				  * @brief  Initialize the server application.
				  * @param  None
				  * @retval None
				  */
				void server_init(void)
				{
				   struct udp_pcb *upcb;                                 
				   
				   /* Create a new UDP control block  */
				   upcb = udp_new();
				   
				   /* Bind the upcb to the UDP_PORT port */
				   /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
				   udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
				   
				   /* Set a receive callback for the upcb */
				   udp_recv(upcb, udp_server_callback, NULL);
				  
				}
				
				/**
				  * @brief This function is called when an UDP datagrm has been received on the port UDP_PORT.
				  * @param arg user supplied argument (udp_pcb.recv_arg)
				  * @param pcb the udp_pcb which received data
				  * @param p the packet buffer that was received
				  * @param addr the remote IP address from which the packet was received
				  * @param port the remote port from which the packet was received
				  * @retval None
				  */
				void udp_server_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
				{
				  struct tcp_pcb *pcb;
				  __IO uint8_t iptab[4];
				  uint8_t iptxt[20];
				  
				  /* We have received the UDP Echo from a client */
				  /* read its IP address */
				  iptab[0] = (uint8_t)((uint32_t)(addr->addr) >> 24);
				  iptab[1] = (uint8_t)((uint32_t)(addr->addr) >> 16);
				  iptab[2] = (uint8_t)((uint32_t)(addr->addr) >> 8);
				  iptab[3] = (uint8_t)((uint32_t)(addr->addr));
				
				  sprintf((char*)iptxt, "is: %d.%d.%d.%d     ", iptab[3], iptab[2], iptab[1], iptab[0]);	                           	                             
					
				  /* Display the client's IP address */
				  /* If there is more than one client connected, the IP address of the last one connected will be displayed */
				  LCD_DisplayStringLine(Line4, "Client's IP address");
				  LCD_DisplayStringLine(Line5, iptxt);
				 
				  /* Connect to the remote client */
				  udp_connect(upcb, addr, UDP_CLIENT_PORT);
				    
				  /* Tell the client that we have accepted it */
				  udp_send(upcb, p);
				
				  /* free the UDP connection, so we can accept new clients */
				  udp_disconnect(upcb);
					
				  /* Bind the upcb to IP_ADDR_ANY address and the UDP_PORT port*/
				  /* Be ready to get a new request from another client */  
				  udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
					
				  /* Set a receive callback for the upcb */
				  udp_recv(upcb, udp_server_callback, NULL);    	
					
				  /* Create a new TCP control block  */
				  pcb = tcp_new();
					
				  if(pcb !=NULL)
				  {
				    err_t err;	  
					      
				    /* Assign to the new pcb a local IP address and a port number */
				    err = tcp_bind(pcb, addr, TCP_PORT);
					  
					if(err != ERR_USE)
					{
					  /* Set the connection to the LISTEN state */
				      pcb = tcp_listen(pcb);
				    
				      /* Specify the function to be called when a connection is established */
				      tcp_accept(pcb, tcp_server_accept);
					}
					else
					{
					  /* We enter here if a conection to the addr IP address already exists */
					  /* so we don't need to establish a new one */
					  tcp_close(pcb);
					}            
				  }
				
				  /* Free the p buffer */
				  pbuf_free(p);
				   
				}
				
				/**
				  * @brief  This funtion is called when a TCP connection has been established on the port TCP_PORT.
				  * @param  arg	user supplied argument 
				  * @param  pcb	the tcp_pcb which accepted the connection
				  * @param  err error value
				  * @retval ERR_OK
				  */
				err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb, err_t err)
				{ 
				  /* Specify the function that should be called when the TCP connection receives data */
				  tcp_recv(pcb, tcp_server_recv);
				
				  return ERR_OK;  
				}
				
				/**
				  * @brief  This function is called when a data is received over the TCP_PORT.
				  *         The received data contains the number of the led to be toggled.
				  * @param  arg	user supplied argument 
				  * @param  pcb	the tcp_pcb which accepted the connection
				  * @param  p the packet buffer that was received
				  * @param  err error value
				  * @retval ERR_OK
				  */
				static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
				{
				  char data;
				
				  /* Read the led number */
				  data = *(((char *)p->payload));  
				
				  /* Toggle the specified led */
				  switch (data)
				  {
				  	case LED1:
					    STM_EVAL_LEDToggle(LED1);
						break;
					
					case LED2:
					    STM_EVAL_LEDToggle(LED2);
						break;
					
					case LED3:
					    STM_EVAL_LEDToggle(LED3);
						break;
					
					case LED4:
					    STM_EVAL_LEDToggle(LED4);
						break;
					
					default:
						break;
				  }
				
				  /* Free the p buffer */
				  pbuf_free(p);
				
				  return ERR_OK;
				}
				
				/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
							

相关资源