2015-08-04 3 views
2

Я пытаюсь связаться с сервером протокола точного времени (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 секунды) должен быть способен его поднять.

Пожалуйста, помогите!

ответ

0

Просто беглый взгляд, но, возможно, не подавите исключение (пустой блок catch), а вместо этого пусть оно будет выброшено или распечатано, чтобы увидеть, какая проблема происходит.

Кроме того, я думаю, вам нужно использовать метод ReceiveFrom, а не Receive, учитывая, что вы работаете с UDP.

another question about some basic UDP stuff

Так называют ReceiveFrom и Bind сокет к IPEndPoint. Вот примерно то, что вам нужно:

private static bool Receive() 
{ 
    bool bReturn = false; 

    int port = 319; 
    string m_serverIP = "127.0.0.1"; 
    byte[] packetData = new byte[86]; 
    EndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(m_serverIP), port); 
    using(Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
    { 
     try 
     { 
      //newSocket.Connect(ipEndPoint); 
      newSocket.Bind(ipEndPoint); 

      newSocket.ReceiveTimeout = 3000; 
      //newSocket.Receive(packetData, SocketFlags.None); 
      int receivedAmount = newSocket.ReceiveFrom(packetData, ref ipEndPoint); 
      newSocket.Close(); 
      bReturn = true; 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine("Dear me! An exception: " + e); 
     } 
    } 

    return bReturn; 
} 
+0

Я тоже пробовал это, но безуспешно. Проблема заключается не в том, что он не может получить (я уже делал UDP и NTP-коммуникации раньше), это значит, что он не найдет/не получит то, что я хочу. – Beneagle

+0

обновлен кодом примера – Anssssss