udp netconn_recv (v1.4.1) issue

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

udp netconn_recv (v1.4.1) issue

newbie
hello network,
I'm using LwIP v1.4.1 ontop of freeRTOS
I've developed a UDP client using netconn API. In simple echo test it could send correctly however netconn_recv() times out (or gets blocked if timeout is disabled).
NB: the server run on posix plateform

/*The client code is: ****************************************************************************/
struct netconn *l_psOutConn;
struct netbuf *l_psOutNetBuf;
struct netbuf *l_psInNetBuf;
struct ip_addr l_sHostIpAddr, l_sServerIPAddr;
err_t l_eConnErr = ERR_OK;

/* wait until getting valid IP address */
  ...

while (TRUE)
{
  l_eConnErr = ERR_OK;

  /* create a new connection */
  l_psOutConn = netconn_new(NETCONN_UDP);

  /* connect the connection to the remote host */
  l_eConnErr |= netconn_connect(l_psOutConn, IP_ADDR_BROADCAST, 1234);//&l_sServerAddr, 1234);

  /* create a new netbuf */
  l_psOutNetBuf = netbuf_new();
  l_psInNetBuf = netbuf_new();

  /* reference the text into the netbuf */
  l_eConnErr |= netbuf_ref(l_psOutNetBuf, g_pcOutData, sizeof(g_pcOutData));
  l_eConnErr |= netbuf_ref(l_psInNetBuf , g_pcInData, sizeof(g_pcInData));

  /* echo process */
  int counter = 0;
  while (l_eConnErr == ERR_OK)
  {
    snprintf(g_pcOutData, sizeof(g_pcOutData), "message number: %d\n\r"\
               "A static text for testing\n\r", counter);
    l_eConnErr |= netconn_sendto(l_psOutConn, l_psOutNetBuf,
                                              IP_ADDR_BROADCAST, D_iServerOverUDPPort);

    /* avoid blocking */
//   netconn_set_recvtimeout(l_psOutConn, 20);

    /* receive echo data */
    if (l_eConnErr == ERR_OK)
//    while (TRUE)
    {
      l_eConnErr |= netconn_recv(l_psOutConn, &l_psOutNetBuf);   // it stucks here!
    }

  counter++;
  netconn_set_recvtimeout(l_psOutConn, 0);
  vTaskDelay(100);
}

    /* deallocate connection and netbuf */
    netbuf_delete(l_psOutNetBuf);
    netbuf_delete(l_psInNetBuf);
    l_eConnErr |= netconn_delete(l_psOutConn);
 }


/*A simple UDP server is nearly: ****************************************************************************/
  /* respond on data reception */
  if ((retVal = recvfrom(socketFd, buf, BUFLEN, 0, (struct sockaddr*)&si_other, &slen))>=0)
  {
      /* receiving succedes */
      printf("Received %d bytes from %s:%d\nData: %s\n\n", retVal,
      inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);

      printf("sending back...\n");
      snprintf(buf, BUFLEN, "server coordinates:  IP<%s> Port number<%d>\r\n", inet_ntoa(si_me.sin_addr), PORT);

// si_other.sin_port = htons(PORT);
     
      while(1)
      {
        /* sendto returns OK */
        if(sendto(socketFd, buf, strlen(buf)+1, 0, (struct sockaddr*) &si_other, sizeof(si_other)) >= 0)
        {
          printf("data sent to %s:%d\r\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
        }
        else
        {
          printf("error sending!\r\n");
        }
        usleep(50000);   // prevent overhead
      }
   
  }

Thank you in advance
Reply | Threaded
Open this post in threaded view
|

Re: udp netconn_recv (v1.4.1) issue

newbie
Ok I've solved it.  
I missed to disconnet from broadcast address
I've added:
 l_eConnErr |= netconn_disconnect(l_psOutConn);
before receiving data.