Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IP-адрес контрол  (Прочитано 9702 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Junk
Гость
« : 17-11-2005 21:59 » 

Привет.
Использую в программе CIPAddressCtrl. Как я понял из описания, там 4 поля для каждого байта ip-адреса. Прочитать/ввести можно либо обратившись к каждому байту, либо заранее сформировав слово DWORD.
Можно ли как-нибудь проще записывать туда адрес (используя int или обычную строку) , а не  шеснадцатеричный код?
И произвести обратное преобразование: DWORD->строка ip-адреса в десятичном виде
« Последнее редактирование: 17-11-2005 22:03 от Junk » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-11-2005 05:29 » 

>>Можно ли как-нибудь проще записывать туда адрес (используя int или обычную
>> строку) , а не  шеснадцатеричный код?
>>И произвести обратное преобразование: DWORD->строка ip-адреса в десятичном
>> виде

хм.. что может быть проще DWORD ?

а преобразовывать из строки в DWORD -
inet_addr

unsigned long inet_addr(  const char* cp);


наоборот -
inet_ntoa

char* FAR inet_ntoa(  struct   in_addr in ) ;
Записан

Junk
Гость
« Ответ #2 : 18-11-2005 18:01 » 

Хочу из диалога CAssDlg вызвать диалог SendDlg с заранее заданными значениями его полей m_Port и m_IPaddr. Но при реализации функции m_IPaddr.SetAddress выдается ошибка "Debug Assertion Failed". Не пойму из-за чего!

void CAssDlg::OnSendDlg()
{
   char *go={""127.1.2.3""};
   DWORD vvv=inet_addr(go);
   if (vvv==INADDR_NONE)
   {
      AfxMessageBox("перебор");
      exit(0);
   }
   SendToDlg STDlg;
   STDlg.m_Port = 6886;
   STDlg.m_IPaddr.SetAddress(vvv);
   STDlg.DoModal();
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 18-11-2005 23:02 » new

Ошибка скорее всего здесь
STDlg.m_IPaddr.SetAddress(vvv);

Пока ты не вызвал STDlg.DoModal(); окно контрола у тебя не существует, а следовательно не может быть проинициаллизированно. Сохрани сначала vvv  в какую нить переменную диалога (например DWORD m_vvv;) а в InitDialog уже делай m_IPaddr.SetAddress(m_vvv);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Junk
Гость
« Ответ #4 : 20-11-2005 18:28 » 

Как можно попроще разрешить следующую ситуацию:

В диалоговом окне ввода параметров (STDlg) ввожу ip-адрес (например, 1.2.3.4),
далее извлекаю его из элемента CIPAddressCtrl
                           m_IPaddr.GetAddress(dwHost);
в основном диалоге перевожу его в текстовый вид
                           struct in_addr sok_addr;
                           sok_addr.S_un.S_addr = STDlg.dwHost;
                           sHostAddr = inet_ntoa(sok_addr);

Проблема в том, что функция ::GetAddress() упаковывает байты в слово dwHost в обратном порядке и получается, что я шлю сообщение на ip-адрес 4.3.2.1
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 21-11-2005 05:52 » 

вообще-то есть вроде какая-то функция, которая делает нормальный hex-IP, но не помню

переверни значение так:

DWORD dwdIP=0;//=STDlg.dwHost;
DWORD dwd=STDlg.dwHost;
for(int i=0;i<4;i++,dwd>>=8)
{
   dwdIP<<=8;
   dwdIP|=(BYTE)dwd;
}

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 21-11-2005 05:58 » 

или так

BYTE by;
DWORD dwdIP=STDlg.dwHost;

by= *((BYTE*)(&dwdIP)+0);
*((BYTE*)(&dwdIP)+0)=*((BYTE*)(&dwdIP)+3);
*((BYTE*)(&dwdIP)+3)=by;

by= *((BYTE*)(&dwdIP)+1);
*((BYTE*)(&dwdIP)+1)=*((BYTE*)(&dwdIP)+2);
*((BYTE*)(&dwdIP)+2)=by;
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines