Я пытаюсь связаться с сервером протокола точного времени (PTP) и строить PTP-часы, используя формы Windows и C#. Я понимаю весь процесс сообщения синхронизации, а иногда и последующее сообщение, затем сообщение с запросом на задержку и, наконец, сообщение с ответом на задержку. Теперь мне нужно общаться с сервером. WireShark собирает все пакеты, которые мне нужны, но как я могу выбрать эти пакеты с помощью C#?PTP Communication
Я понимаю, что мультикастинг делается с IP-адресом 224.0.1.129 порт PTP 319. Моя грубая схема выглядит так:
while (true) //Continuously getting the accurate time
{
if (Receive())
{
//create timestamp of received time
//extract timestamp of sent time
//send delay request
//Receive timestamp
//create receive timestamp
//calculate round trip time
//adjust clock to new time
}
}
private bool Receive()
{
bool bReturn = false;
int port = 319;
string m_serverIP = "224.0.1.129";
byte[] packetData = new byte[86];
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(m_serverIP), port);
Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
{
newSocket.Connect(ipEndPoint);
newSocket.ReceiveTimeout = 3000;
newSocket.Receive(packetData, SocketFlags.None);
newSocket.Close();
bReturn = true;
}
catch
{ }
return bReturn;
}
Где Receive() представляет собой метод, который возвращает логическое значение, если вы получили сообщение синхронизации и в конечном итоге сохранит сообщение в байтах. Я пытаюсь использовать сокеты для подключения к серверу, но мой таймер всегда отключается и возвращает false. У меня установлен PTP-сервер для отправки сообщения синхронизации каждую секунду, поэтому я знаю, что мой тайм-аут (через 3 секунды) должен быть способен его поднять.
Пожалуйста, помогите!
Я тоже пробовал это, но безуспешно. Проблема заключается не в том, что он не может получить (я уже делал UDP и NTP-коммуникации раньше), это значит, что он не найдет/не получит то, что я хочу. – Beneagle
обновлен кодом примера – Anssssss