我想弄清楚我需要發送(客戶端)在NTP請求包中從服務器中檢索NTP包。我正在使用Cortex M3上的LWIP,Stellaris LM3S6965NTP請求數據包
據我所知,我將收到一個UDP標頭,然後用不同的時間戳NTP協議刪除延遲。我可能需要製作一個UDP標頭,但我需要添加什麼數據?
Wireshark的圖像:
我希望你們能幫助我。
我想弄清楚我需要發送(客戶端)在NTP請求包中從服務器中檢索NTP包。我正在使用Cortex M3上的LWIP,Stellaris LM3S6965NTP請求數據包
據我所知,我將收到一個UDP標頭,然後用不同的時間戳NTP協議刪除延遲。我可能需要製作一個UDP標頭,但我需要添加什麼數據?
Wireshark的圖像:
我希望你們能幫助我。
這是對於初學者:http://www.eecis.udel.edu/~mills/ntp/html/warp.html
的情況下,檢查了這一點,你有沒有:http://tools.ietf.org/html/rfc5905
然後看看這個:http://wiki.wireshark.org/NTP,並檢查了,他們已經上傳的樣本PCAP文件。
我不確定這是否有幫助,但我希望如此。
客戶端請求數據包與服務器回覆數據包相同 - 只需將第一個字中的MODE位設置爲3(客戶端)即可。
發送整個48字節的數據包到服務器,它會回覆相同的。
最簡單的數據包是0x1B,後面是47個零。 (版本= 3,模式= 3)
正確的答案是,在將這種格式發送到NTP服務器之後,I **收到了一些**回覆(之前引發了「TimeOutException」)。 也許你也可以告訴如何從接收到的數據包中提取**時間?也就是說,從收到的** 48字節**中,如何將**打印時間設置爲「YYYY:MM:DD:HH:MM:SS」(或其他格式)?哪些位對應於什麼? – mercury0114
我已編碼一個Arduino這裏使用此代碼連接到NTP服務器,
http://www.instructables.com/id/Arduino-Internet-Time-Client/step2/Code/
看稱爲getTimeAndDate,和sendNTPpacket的方法。
這是發送的數據包。這是設置一個緩衝區,並顯示二進制(0b)和十六進制(0x)被設置在48個字符的緩衝區中。地址是NTP時間服務器,
memset(packetBuffer, 0, NTP_PACKET_SIZE);
packetBuffer[0] = 0b11100011;
packetBuffer[1] = 0;
packetBuffer[2] = 6;
packetBuffer[3] = 0xEC;
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
Udp.beginPacket(address, 123);
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
這裏是發生了什麼接收到的數據包,
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer
unsigned long highWord, lowWord, epoch;
highWord = word(packetBuffer[40], packetBuffer[41]);
lowWord = word(packetBuffer[42], packetBuffer[43]);
epoch = highWord << 16 | lowWord;
epoch = epoch - 2208988800 + timeZoneOffset;
flag=1;
setTime(epoch);
時刻設定爲Arduino的時間庫的一部分,所以時代應該是因爲秒數1900年1月1日作爲建議在這裏(搜索時代),
https://en.wikipedia.org/wiki/Network_Time_Protocol
,但如果你想有一個C#版本,我發現這個在這裏,在編譯的代碼除外答案和它的作品。這可能對你更有意義,並且顯示1/1/1900時代的使用。
How to Query an NTP Server using C#?
可以很容易看到的相似。
是啊已經檢查過這些鏈接。但我只能看到從ntp收到的文件而不是發送的文件。 – Sharpless512