Исходник [SSL]Получение On-Line Date, Time, IP

Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Тут будет черная пречёрная магия.....
Кто ей не владеет, проходим мимо.


Обращаться будем к worldtimeapi.org
Создаем запрос к API для получения данных
C++:
char buffer1[2000];
WSAStartup(MAKEWORD(2, 2), &wsa);
    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct hostent* host;
    host = gethostbyname("worldtimeapi.org");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port = htons(80);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);

    connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr));

    _send(Socket, "GET /api/timezone/Europe/Kiev.txt HTTP/1.1\r\nHost: worldtimeapi.org\r\nConnection: close\r\n\r\n");
    _recv(Socket, buffer1, 2000);
GET /api/timezone/Europe/Kiev.txt - это у нас часовой пояс.
Ответ в таком виде
Код:
abbreviation: EEST
client_ip: 91.196.89.201
datetime: 2021-06-25T23:13:17.732622+03:00
day_of_week: 5
day_of_year: 176
dst: true
dst_from: 2021-03-28T01:00:00+00:00
dst_offset: 3600
dst_until: 2021-10-31T01:00:00+00:00
raw_offset: 7200
timezone: Europe/Zaporozhye
unixtime: 1624651997
utc_datetime: 2021-06-25T20:13:17.732622+00:00
utc_offset: +03:00
week_number: 25
Весь список часовых поясов
Пожалуйста, авторизуйтесь для просмотра ссылки.


Мы получили эти данные в buffer1 (_recv(Socket, buffer1, 2000);)
Далее нужно разделить ответ на строки
C++:
    strcpy(buffer4, strstr(buffer1, "\r\n\r\n") + 4);
    const char* delims = "\n";
    char** words = split_string(buffer4, delims);
C++:
char ** split_string(const char *str, const char *delims)
{
 
    size_t str_len = strlen(str);
    size_t words_cntr = 1;
    char **words;
    size_t i, j;
    size_t w;

    for (i = 0; i < str_len; ++i)
        if (strchr(delims, str[i]) != NULL)
            ++words_cntr;

    words = (char **)malloc((words_cntr + 1) * sizeof(char *));
    words[words_cntr] = NULL;
    for (i = 0, w = 0; i < str_len + 1; ++i)
    {
        j = i;
        while (str[j] != '\0' && strchr(delims, str[j]) == NULL)
            ++j;
        words[w] = (char *)malloc((j - i + 1) * sizeof(char));
        strncpy(words[w], str + i, j - i);
        words[w++][j - i] = '\0';
        i = j;
    }
 
    return words;
}
и далее в нашем массиве будет отдельная строка.
C++:
words[0] - abbreviation: EEST
words[1] - client_ip: 91.196.89.201
words[2] - datetime: 2021-06-25T23:13:17.732622+03:00
words[3] - day_of_week: 5
words[4] - day_of_year: 176
words[5] - dst: true
words[6] - dst_from: 2021-03-28T01:00:00+00:00
words[8] - dst_offset: 3600
words[9] - dst_until: 2021-10-31T01:00:00+00:00
words[10] - raw_offset: 7200
words[11] - timezone: Europe/Zaporozhye
words[12] - unixtime: 1624651997
words[13] - utc_datetime: 2021-06-25T20:13:17.732622+00:00
words[14] - utc_offset: +03:00
words[15] - week_number: 25
Что бы правильно воспользоваться этими данными, нужно воспользоваться черной магией.....
Давайте заведем некий клас данных, в которую будем писать данные, а после их использовать:

Код:
class cUser
{
public:
    string client_ip;
    string Web_date;
    string time;
    string timezone;
    string utc_datetime;
    string utc_offset;
};
extern cUser pUser;
создаем переменную типа string
C++:
string::size_type start_posn;
string::size_type end_posn;
Для получения IP:
C++:
string client_ip = words[1]; //- под массивом 1 у нас IP
start_posn = client_ip.find("client_ip: ");
    if (start_posn != string::npos)
    {
        start_posn += strlen("client_ip: ");
    }
    end_posn = client_ip.find(" ", start_posn);
    length = end_posn - start_posn;
    pUser.client_ip = client_ip.substr(start_posn, length);
Для получения текущей даты:
C++:
string datetime = words[2];
start_posn = datetime.find(":");
    if (start_posn != string::npos)
    {
        start_posn += strlen(":") + 1;
    }
    end_posn = datetime.find("T", start_posn);
    length = end_posn - start_posn;
    pUser.Web_date = datetime.substr(start_posn, length);
Для получения текущего времени:
C++:
start_posn = datetime.find("T");
    if (start_posn != string::npos)
    {
        start_posn += strlen("T");
    }
    end_posn = datetime.find(".", start_posn);
    length = end_posn - start_posn;
    pUser.time = datetime.substr(start_posn, length);
Мы получили:
- IP
- Date
- Time


Для тех, кто не понял:
Имея строку "words[2] - datetime: 2021-06-25T23:13:17.732622+03:00"
Мы с помощью библиотеки string делаем поиск по данной строке, с лево на право.
Для получения даты находим символ (:) и читаем строку до символа (Т) и записываем в таблицу ( pUser.Web_date = datetime.substr(start_posn, length);)
Для получения времени находим символ (Т) и читаем строку до символа (.) и записываем в таблицу ( pUser.time = datetime.substr(start_posn, length);)

На последок:
Хотим получить часовой пояс (words[11] - timezone:)
это у нас 11 массив в строке
создаем переменную
string timezone= words[11]; //- под массивом 1 у нас timezone
И все по старому примеру
Строка имеет следующий вид: timezone: бла-бла-бла
C++:
[CODE=cpp]
start_posn = client_ip.find("timezone: ");
if (start_posn != string::npos)
    {
        start_posn += strlen("timezone: ");
    }
    end_posn = client_ip.find(" ", start_posn);
    length = end_posn - start_posn;
    pUser.timezone= datetime.substr(start_posn, length);
[/CODE]
в итоге в наш класс\структуру pUser.timezone мы записали - Europe/Zaporozhye
Где-то что-то упустил.
 
Последнее редактирование модератором:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Обращаться будем к worldtimeapi.org
Что-то тут перемудрено.
1. gethostbyname шагает в etc/hosts, это значит все это разом можно подменить
2. при парсинге нельзя полагаться на никакие индексы, нужно точно искать по строкам, гораздо проще найти "client_ip: " и от позиции + длину этого тега и парсить до конца строки/текста.
3. всю эту инфу должен возвращать сервер p2c в своем зашифрованном протоколе (не http/s) и даже парсить ничего не придется.

Где-то что-то упустил.
Похоже сам [SSL]Получение On-Line Date, Time, IP, здесь нет никакого https, это обычный сырой http без какого либо шифрования.
 
Последнее редактирование:
Сверху Снизу