This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

UDP BSD Client

Hi everyone.
I'm trying to synchronize MCU internal clock with NTP server. My code is already running on some older projects. Now I need to migrate my code to RTX environment and BSD sockets.

Below is simplified task created for testing purpuses. I'm using MDK ARM Professional 4.73.

__task void ntp_request_task (void)
{
   SOCKADDR_IN sock_addr;

   int32_t soc;
   int32_t res;
   int32_t slen = sizeof(sock_addr);

   uint8_t ntp_data[48] =  { 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                           };

   os_itv_set(3000);

   while (1)
   {
      os_itv_wait();

      soc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
      sock_addr.sin_port = htons(params.Sntp.UdpPort);
      sock_addr.sin_family = PF_INET;

      sock_addr.sin_addr.s_b1 = params.Sntp.ip[0];
      sock_addr.sin_addr.s_b2 = params.Sntp.ip[1];
      sock_addr.sin_addr.s_b3 = params.Sntp.ip[2];
      sock_addr.sin_addr.s_b4 = params.Sntp.ip[3];

      // prepare_ntp_request(data);

      if((res = sendto(soc, (const char*) ntp_data, sizeof(ntp_data), 0, (SOCKADDR *) &sock_addr, slen)) == sizeof(ntp_data))
      {
         res = recvfrom (soc, (char *) ntp_data, sizeof (ntp_data), 0, (SOCKADDR *) &sock_addr, &slen);

         if(res < 0)
         {
            printf("recvfrom error code: %d\n", res);
         }
      }

      closesocket(soc);
   }
}

After I send NTP request, I can't read server response. Everything seems OK in Wireshark.
Problem is in recvfrom function. Recvfrom function returns error code -2 (SCK_EINVALID). If I use TCP Debug Library, I get following error log.

BSD: Recv/from Socket 1
BSD-ERR: Recv, Socket 1 wrong state

0