Двоичная форма wxIPaddress Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
MihanEntalpo
In need of some credit
In need of some credit
Posts: 5
Joined: Sun Jul 11, 2010 5:13 pm
Contact:

Двоичная форма wxIPaddress

Post by MihanEntalpo » Sun Jul 11, 2010 5:45 pm

Здравствуйте уважаемые братья по цеху!
Пришел к вам со следующей проблемой:

Класс wxIPaddress, как и все его предки и потомки возвращает собственно значение IP-адреса в виде строки wxString("192.168.0.1"), тогда как мне нужно получить этот адрес в виде беззнакового 4-х байтного целого числа.

Нужно это для того чтобы к сокетам подключающихся к серверу пользователей привязать некие объекты класса Client с помощью отображения map<int,Client*>. Хотя отображение это и можно создать используя wxString вместо int, но легко представить насколько дольше происходит операция сравнения двух строк нежели чем двух целых чисел.

И каждый раз, при получении нескольких килобайт данных проводить поиск клиента по строковой версии IP-адреса - ИМХО весьма накладно.

Если есть какой-то способ получить эту двоичную форму IP и здешние пытливые умы мне на него покажут - буду весьма признателен, поскольку изучил документацию вдоль и поперек и ничего подобного не нашел :(

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Двоичная форма wxIPaddress

Post by Mojo » Sun Jul 11, 2010 5:49 pm

MihanEntalpo wrote:Здравствуйте уважаемые братья по цеху!
Пришел к вам со следующей проблемой:

Класс wxIPaddress, как и все его предки и потомки возвращает собственно значение IP-адреса в виде строки wxString("192.168.0.1"), тогда как мне нужно получить этот адрес в виде беззнакового 4-х байтного целого числа.

Нужно это для того чтобы к сокетам подключающихся к серверу пользователей привязать некие объекты класса Client с помощью отображения map<int,Client*>. Хотя отображение это и можно создать используя wxString вместо int, но легко представить насколько дольше происходит операция сравнения двух строк нежели чем двух целых чисел.

И каждый раз, при получении нескольких килобайт данных проводить поиск клиента по строковой версии IP-адреса - ИМХО весьма накладно.

Если есть какой-то способ получить эту двоичную форму IP и здешние пытливые умы мне на него покажут - буду весьма признателен, поскольку изучил документацию вдоль и поперек и ничего подобного не нашел :(

http://wiki.wxwidgets.org/Converting_ev ... m_wxString
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

MihanEntalpo
In need of some credit
In need of some credit
Posts: 5
Joined: Sun Jul 11, 2010 5:13 pm
Contact:

Re: Двоичная форма wxIPaddress

Post by MihanEntalpo » Sun Jul 11, 2010 5:59 pm

Спасибо за ответ, конвертация - вещь хорошая, но в моем случае - это тоже самое что использование самой строки.

Объясню почему:

При подключении клиента я могу:
1)получить его адрес, и он будет в виде wxString
2) после этого я могу сконвертировать адрес из wxString в Int (не важно, способом указанным по данной вами ссылке или с помощью изобретенного мной парсера)
3) создать новый объект, хранящий данные клиента, и запихать его в map<int,client*> используя в качестве ключа тот Int, который я получил в пункте 2
4) каждый раз когда будет происходить событие "получение данных" я буду извлекать сокет из этого события, и получать от него IP-адрес, опять же в форме wxString, 5) после чего конвертировать его в Int,
5)и искать соответствующий объект клиента по данному Int'у

Это почти тоже самое что создать map<wxString,Client*> и каждый раз сразу по wxString'у искать клиента, ведь в map'е происходит сравнение ключа с другими ключами на тему больше/меньше, а для строк это делается гораздо медленнее чем для Int'ов.

Если бы Int можно было получить сразу, в чистом виде - это было бы идеально. Но вот можно ли?

MihanEntalpo
In need of some credit
In need of some credit
Posts: 5
Joined: Sun Jul 11, 2010 5:13 pm
Contact:

Post by MihanEntalpo » Sun Jul 11, 2010 6:48 pm

Ничего не понял )) map<int,client*> int это ключ? тот самый IP-адрес который конвертируется из wxString в int?

Так точно, int - это ключ, который хотелось бы не конвертировать из wxString, а получать откуда-то (например из wxIPV4address) сразу же, ведь во всех TCP пакетах IP-адрес представлен именно в бинарном виде, а то получается, что в wxWidgets "для удобства" сделали чтобы адрес был в удобочитаемой форме, а исходный "сырой" вид спрятали в секции private.

Вопрос именно в том, можно ли как-то получить этот адрес в виде Int не прибегая к конвертации того что уже было сконвертировано в wxString для человеко-читабельности

MihanEntalpo
In need of some credit
In need of some credit
Posts: 5
Joined: Sun Jul 11, 2010 5:13 pm
Contact:

Post by MihanEntalpo » Mon Jul 12, 2010 6:11 am

Похоже имеет место некоторое недопонимание.

Мне не нужно конвертировать из Int в wxString, наоборот, мне нужно получить из wxString форматированного как IP-адрес "123.43.55.0" число Int, состоящее из тех самых четырех байт, из которых состоит любой IPv4-адрес. И я просто не вижу смысла в том чтобы это делать, зная что изначально IP-адрес приходит в систему именно в виде 4-байтного целого. Если wxWidgets так скрывают от меня эту информацию, и "помогают" мне преобразуя INT в человеко-читабельный формат, вынуждая меня делать обратное преобразование, то это похоже на анти-паттерн "Инверсия абстракции"...

В общем видимо буду рыть исходники wxWidgets, наверняка класс wxIPv4address содержит в себе приватное поле int raw_ip, которое можно получить при помощью смещения от адреса указателя...

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Wed Jul 14, 2010 9:25 am


Post Reply