stm32 网络编程

//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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值