7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
1

Парсинг IPv4

17.05.2018, 22:11. Показов 1405. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал функцию для парсинга IPv4.
И не соображу как надо переделать условия, что бы if (_it == _end) не висело как апендикс в конце цикла? Потому что делает почти все тоже, что и под Метка 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
bool IPAddressUtils::parseIP4(IPv4Address& address ,const std::string &_ip) {
 
    if (_ip.empty() || _ip.size() > 15)
        return false;
 
    std::string::const_iterator _it    = _ip.cbegin();
    std::string::const_iterator _end   = --_ip.cend();
 
    IPv4Address _address    = 0;
    int _dotCount           = 0;
    unsigned long _temp     = 0;
 
    while (_dotCount < 4) {
        if (*_it >= '0' && *_it <= '9') {
            _temp *= 10;
            _temp += (*_it - '0');
        } else if (*_it == '.' && (_it != _ip.cbegin() || _it != _end)) {
            ++_dotCount;
 
            if (_temp & ~0xff) return false; // Метка 1
 
            _address |= _temp;
            _address <<= 8;
            _temp = 0;
        } else return false;
 
        if (_it == _end) {
            if (_temp & ~0xff) return false;
            _address |= _temp;
            address = _address;
            return true;
        }
        ++_it;
    }
 
    return false;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2018, 22:11
Ответы с готовыми решениями:

Напишите программу, которая считывает IPv4 адрес и проверяет ее валидность. Форма записи IPv4 адреса – x.x.x.x
Напишите код для программы Пример: Напишите программу, которая считывает IPv4 адрес и проверяет...

gethostbyname: получение полного списка ipv4 и ipv6 адресов в текстовом представлении
Как-то недоходчиво написано в манах как работать с этой функцией. Я передаю в неё днс, она...

Роутер и ipv4
Здравствуйте. Захотел купить роутер,сам в этом ничего не понимаю. Провайдер использует ipv4 по...

Маршрутизация ipv4
Всем привет! Ситуация такая: есть 10 компьютеров в разных городах и каждый подключен к сети...

11
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
18.05.2018, 09:07 2
DARKPALADIN, а что после парсинга хочешь получить?
0
7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
18.05.2018, 09:10  [ТС] 3
qwe123qwea, а забыл, unsigned int 4 байта
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
18.05.2018, 09:39 4
DARKPALADIN, проблема решена?
0
7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
18.05.2018, 10:01  [ТС] 5
qwe123qwea, Да нет. Как бы IPv4Address и есть unsigned int. Но вот последнее условие в цикле мешается.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
18.05.2018, 10:14 6
DARKPALADIN, ты получить то что в результате хочешь? Число? Есть же уже готовая функция
C++
1
inet_addr(const char * ip)
.
0
7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
18.05.2018, 10:15  [ТС] 7
qwe123qwea, Да
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
18.05.2018, 10:20 8
Для Windows:
C++
1
2
#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
Для Linux вроде:
C++
1
#include <arpa/inet.h>
А если хочешь изобретать велосипед, то
C++
1
IPv4Address
советую сделать
C++
1
unsigned long
.
0
7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
18.05.2018, 10:43  [ТС] 9
qwe123qwea, Я бы согласился использовать такой простой обход. Но мне всё это нужно для парсинга URI, конечно как практика.

Пишу под OS X.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
19.05.2018, 11:24 10
Лучший ответ Сообщение было отмечено DARKPALADIN как решение

Решение

DARKPALADIN, вот этот кусок выполняет тоже самое, что и ты делаешь:
C++
1
2
3
4
char arr[] = "172.17.4.111";
unsigned char a, b, c, d;
sscanf(arr, "%hhu.%hhu.%hhu.%hhu", &a, &b, &c, &d );
unsigned long ipAddr = ( a << 24 ) | ( b << 16 ) | ( c << 8 ) | d;
Добавлено через 4 минуты
DARKPALADIN, а если вот так сделать, то выполняется тоже самое что и функция inet_addr():
C++
1
2
3
4
5
6
    char arr[] = "172.17.4.111";
 
 
    unsigned char a, b, c, d;
    sscanf(arr, "%hhu.%hhu.%hhu.%hhu", &a, &b, &c, &d );
    unsigned long ipAddr = ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a;
1
7 / 7 / 8
Регистрация: 19.06.2016
Сообщений: 134
19.05.2018, 17:05  [ТС] 11
qwe123qwea, Спасибо. Попробую.
Только вот ssd со всем проектом полетел
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
19.05.2018, 19:04 12
DARKPALADIN, резервные копии делай на хард)
0
19.05.2018, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2018, 19:04
Помогаю со студенческими работами здесь

Pxe over ipv4
Как это исправить, подскажите пожалуйста.

Windows 10: ipv4 не подключено
Добрый день, форумчане! Прощу вашей помощи в решении проблемы. Есть винда 10 профессиональная...

Linux TCP/IPv4
Доброе время суток. Вопрос не сложный и заключается в следующем: Нужно прописать ИП...

Количество реальных IPv4
Здравствуйте, обращаюсь на форум в надежде получить ответ. Итак, собственно сам вопрос. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru