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