Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> самоделка типа net time 
V
    Опции темы
mrbrooks
Дата 9.1.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Комрады! Подсобите куда копать что бы написать простенькую утилиту аля net time?
PM MAIL   Вверх
jonie
Дата 9.1.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



известно куда - в строну протокола NTP (благо он мега простой)
http://ru.wikipedia.org/wiki/NTP


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 10.1.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Сенкс. Но вот как его юзать. Все что нарыл так это пример на C#. А он мне не друг. Честно говоря не могу уловить идеологию как писать свой ntp - client.  
PM MAIL   Вверх
mrbrooks
Дата 10.1.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



to jonie Если я правильно понял - неоходимо - допустим написать клиент и послать буфер запроса указанного в документации на сервер с портом 123? Попробую. Но это как то просто получается.
PM MAIL   Вверх
atavinta
Дата 5.2.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.1.2008
Где: Москва

Репутация: нет
Всего: нет



У тебя что сервер чужой. Если делаешь обе части и не можешь разобраться с протоколом - опередели свой. 
PM MAIL WWW   Вверх
jonie
Дата 10.2.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



нда.... делать свой сервер времени это жесть... есть готовые работающие и стандартные , любите изобретать никому непонятные велосипеды ?

Добавлено @ 20:40
http://www.codeguru.com/csharp/csharp/cs_d...icle.php/c4207/

вот тут простейший клиент, вполне устроит имхо.

Это сообщение отредактировал(а) jonie - 10.2.2008, 20:44


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 11.2.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Да сервак чужой. Мое дело синхронизировать с ним по времени девайс. С протоколом вроде разобрался но вот все одно сервер несет какую то ахинею. Грубо говоря в соответствие с документацией по SNTP я  посылаю серверу свое время от 1 января 1900 года 0 часов 0 минут. Как говориться где то есть нюанс который мне не догнать. 
Метка посылается правильная (я так надеюсь) - а вот ответ от сервера нифига. Тут собственно нужен чисто политический совет - хотя все пишу строго по документации.

таким макаром я получаю метку времени.
Код

const unsigned __int64 B1900 = 9435484800;
*****************************
//формат самой метки времени по правилам NTP - 8 байт
struct  TimePacket 
{
    unsigned long m_dwInteger;
    unsigned long m_dwFractional;
};
*****************************
//формирование времени от 01.01.1900 0:0:0
 TimePacket TimeToSNTP()
 {
 TimePacket tp;
 SYSTEMTIME st;
 GetSystemTime(&st);
 __int64 utctime, localtime; 
 SystemTimeToFileTime(&st,(FILETIME*)&localtime);
 LocalFileTimeToFileTime((FILETIME*)&localtime,(FILETIME*)&utctime);
 utctime /= 10000000;
 utctime -= B1900;
 tp.m_dwInteger = (unsigned long)utctime;
 tp.m_dwFractional = st.wMilliseconds + 4294967;
 return tp;
 }


jonie cпасибо комрад  smile но я надыбал его еще в самом начале. Пытался компильнуть в VS2005 - но чет ему там очень не нравится. Код понятен - но все подводные камни там обойдены классами dot.net или как он там по научному.
Для себя я надыбал аж целый класс написанный зарубежным комрадом вот здесь выгледит весьма правдобоподобно. 
Собственно все посылки проходят нормально. Но вот ответ от сервера неудовлеворительный
 
PM MAIL   Вверх
jonie
Дата 11.2.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



знать чет не так делаешь..ну на крайний случай возьми ты сниффер и сравни что не так шлешь 8) или что тебе отвечает сервер)

ну а почему не испльзуешь тот готовый класс? (да и вообще в *n?x есть sntp клиент)....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 11.2.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(jonie @ 11.2.2008,  17:02)
ну а почему не испльзуешь тот готовый класс? (да и вообще в *n?x есть sntp клиент)....

Я бы с удовольствием - но оговорюсь сразу - клиент планируется под WinCE 4.2 - а в этой штуки ты фактически без рук и ног - и еще без хвоста. Вот именно этой класс под CE импортировать смерти подобно - особенно в eVC++ 4. 

Вот и пишу свой. А сервер отвечает весьма бодро. Мол 21 августа 2175 года. Хорошо что хоть Анклав не пингует и убежище не просит чип для воды... пардон за оффтоп   smile 

PM MAIL   Вверх
jonie
Дата 12.2.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



везде данные в net формате передаешь где надо ?
Код

#include "stdafx.h"

#pragma comment(lib,"Ws2_32.lib")

#define NTP_EPOCH            (86400U * (365U * 70U + 17U))
#define NTP_PORT             123
#define NTP_REPLY_TIMEOUT    6000
#define TIME_ADJUST_INTERVAL (8 * 60 * 60 * 1000)
#define TIME_ADJUST_RETRY    (5 * 60 * 1000)

struct ntp_packet
{
    unsigned char mode : 3;
    unsigned char vn : 3;
    unsigned char li : 2;
    unsigned char stratum;
    char poll;
    char precision;
    unsigned long root_delay;
    unsigned long root_dispersion;
    unsigned long reference_identifier;

    __int64 reference_timestamp;
    __int64 originate_timestamp;
    __int64 receive_timestamp;
    __int64 transmit_timestamp;

};


int main(int argc, char* argv[])
{
    WSADATA wsa;
    WSAStartup(MAKEWORD(2,2), &wsa);

    SOCKET soc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("192.43.244.18");
    clientService.sin_port = htons(123);

    if(SOCKET_ERROR == connect(soc, (sockaddr*)&clientService, sizeof(clientService))) {
        OutputDebugStr("connect failed");
        closesocket(soc);
        WSACleanup();
        return -1;
    }

    ntp_packet pkt;

    memset(&pkt, 0, sizeof pkt);
    pkt.vn = 4;
    pkt.mode = 3;
    pkt.originate_timestamp = htonl(time(0) + NTP_EPOCH);


    DWORD rc = send(soc, (char*)&pkt, sizeof pkt, 0);
    if(rc != sizeof(pkt)) {
        OutputDebugStr("send failed");
        closesocket(soc);
        WSACleanup();
        return -1;
    }

    int timeout = NTP_REPLY_TIMEOUT;
    setsockopt(soc, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(int)); 

    rc = recvfrom(soc, (char*)&pkt, sizeof pkt, 0, NULL, NULL);
    if(rc != sizeof(pkt)) {
        OutputDebugStr("recv failed");
        closesocket(soc);
        WSACleanup();
        return -1;
    }

......блаблабла.... вот тут сам додумай че там нада и напиши) мне уже лень.... 

    closesocket(soc);
    WSACleanup();
    return 0;
}

както типа того.. спать пойду) лень разбираться че тут откуда вычиатать и на что делить )


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 12.2.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



да у меня все так и есть имхо. Только во всех примерах что я видел посылка метки идет в поле transmit_timestamp. А так все аналогично.

Добавлено через 4 минуты и 39 секунд
кстати фишка в том что в посылке два поля - в одном секунды в другом миллисекунды. а у тебя выходит только секунды
Код

pkt.originate_timestamp = htonl(time(0) + NTP_EPOCH);

Но все равно спасибо. 

PM MAIL   Вверх
jonie
Дата 12.2.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



дык ты разобрался?... я уже вчера спал 8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 13.2.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Можно сказать и так. Клиент работает будте нате. Осталось разобраться в чем загвоздка при приеме данных - а точнее их качество. Вот на этот вопрос наверно есть ответ только у самих разрабов протокола.
PM MAIL   Вверх
mrbrooks
Дата 27.2.2008, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Все разобрался. Вы будете смеяться. Косяк был в сетевом порядке байтов  smile 
PM MAIL   Вверх
jonie
Дата 28.2.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



я внимательнее читал rfc) тыб выложил если не жалка) другим мож поможет...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.