stm32 网络编程

来源:互联网 发布:阿里郎兰花指mp3百度云 编辑:程序博客网 时间:2024/06/10 04:49
//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 0