//udp初始化
void udp_server_init(void)
{
err_t err;
IP4_ADDR(&ipaddr_host,IP_1,IP_2,IP_3,IP_4);
/* Create a new UDP control block */
serv_pcb = udp_new();
if (serv_pcb)
{
/* Bind the upcb to the UDP_PORT port */
/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
err = udp_bind(serv_pcb, IP_ADDR_ANY, UDP_SERVER_PORT);
if(err == ERR_OK)
{
/* Set a receive callback for the upcb */
udp_recv(serv_pcb, udp_server_callback, NULL);
}
else
{
printf("can not bind pcb");
}
}
else
{
printf("can not create pcb");
}
printf("* @ udp_server is initialized \r\n");
}
/**
* @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)
{
//#ifdef Show_Host_IP
__IO uint8_t iptab[4];
/* 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));
//printf("is: %d.%d.%d.%d ", iptab[3], iptab[2], iptab[1], iptab[0]);
//#endif
memcpy((void *)&buff,p->payload,p->len);
pushrecv(buff,p->len);
/* size=getrecv(dd);
qq = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
qq->payload =(void*)dd;
udp_connect(upcb, addr, 1000);
udp_send(upcb, qq);
udp_disconnect(upcb);
pbuf_free(qq); */
pbuf_free(p);
}
/**
* @brief Push net recieve into buffer
* @param None
* @retval None
*/
///////////////////////////////////////////
//数据入栈
void pushrecv(char * recv,uint16_t size)
{
if(size >0)
{
memcpy(&(m_recvbuf[m_bufwritep].buff),recv,size);
m_recvbuf[m_bufwritep].size=size;
m_bufwritep++;
m_bufsize++;
if(m_bufsize==NETBUFSIZE)
{
m_bufwritep=1;
m_bufsize=1;
m_bufreadp=0;
}
}
}
/**
* @brief Get net recieve from buffer
* @param None
* @retval None
*/
///////////////////////////////////////////
//接收数据
uint8_t getrecv(char * recv)
{
uint8_t size;
if (m_bufsize>0)
{
size=m_recvbuf[m_bufreadp].size;
memcpy(recv,&(m_recvbuf[m_bufreadp].buff),size);
m_bufreadp++;
if(m_bufreadp>=m_bufwritep)
{
m_bufwritep=0;
m_bufsize=0;
m_bufreadp=0;
}
}
else
{
size=0;
recv=NULL;
}
return size;
}
/////////////////////////////////////////////
//客户端发送
uint16_t udp_client_send(char * send,uint16_t size)
{
struct pbuf *q;
q = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
// printf("pbuf_alloc :%x size:%d\r\n",(int)q,size);
q->payload =(void*)send;
// printf("udp_sendto :%x ipaddr_host:%x\r\n",(int)serv_pcb,(int)&ipaddr_host);
udp_sendto(serv_pcb,q,&ipaddr_host,UDP_CLIENT_PORT);
/* Free the p buffer */
pbuf_free(q);
return size;
}
stm32 网络编程
最新推荐文章于 2025-02-13 20:46:35 发布