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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать параметры dhcp сервера, если он есть 
:(
    Опции темы
Rickert
Дата 25.4.2007, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Я уже чеконулся smile 
Столько всяких описаний dhcp пакетов, а толком - ничего.
Вопрос в следующем: какой надо сформировать пакет и на какой адрес отослать, чтобы узнать адрес dhcp сервера, если он есть.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
SenkraD
Дата 25.4.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

 какой надо сформировать пакет и на какой адрес отослать, чтобы узнать адрес dhcp сервера, если он есть.


Что это означает можеш обьснить


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Rickert
Дата 25.4.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



SenkraD, ты если ничего не понимаешь, зачем спрашиваешь?
На пальцах, для особо одарённых: есть протокол dhcp, с помощью которого по сети динамически раздаются ip'шники. Раздаёт их сервер. Чтобы получить свой ip, надо стункуться к серверу. Адрес сервера берётся из конфига, который пишется вручную. Или при старте клиент посылает широковещательный запрос (на "255.255.255.255:67"), определённым образом сформированный DISCOVERY пакет, ответом на который, будет список dhcp серверов с их адресами. Так вот, я не могу понять, когда пытаюсь через сокеты делать - она меня посылает и говорит, что мол "network is unreacheble", типа нет сети - она не досягаема. В тоже время, есть такая утилита dhcleint, которая идёт стандартно в пачке с *n?x системами, которая спокойно работает. Если глядеть её лог, она что-то творит с устройством eth0 и работает через него. Вот я и не могу понять: что откуда и куда. Хотя не исключено, что она опять-таки работает, с уже заранее написанным конфигом smile 
Кто в курсе? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 25.4.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Пытаюсь послать DISCOVERY пакет на 67 порт 255.255.255.255, она мне говорит "invalid argument". Дело в IP'шники - точно. Потому что при смене - посылает. Но надо-то на 255.255.255.255. В чём ошибка?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
ptr
Дата 26.4.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rickert, показывай код.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Rickert
Дата 27.4.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Код

//=============================================================================

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <memory.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

//=============================================================================

int main()
{
  struct sockaddr_in addr;
  struct sockaddr_in tmpAddr;
  int tmpSize2 = sizeof(tmpAddr);
  
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(67);
  addr.sin_addr.s_addr = inet_addr("255.255.255.255");
  
  int tmpSize = sizeof(addr);
  int sock = socket(PF_INET, SOCK_DGRAM, 0);
  
  printf("Client socket: %d\n", sock);
  
  unsigned char buf[44];

  buf[0] = char(1);
  buf[1] = char(1);
  buf[2] = char(6);
  buf[3] = char(0);
  buf[4] = char(0);
  buf[5] = char(0);
  buf[6] = char(0);
  buf[7] = char(5);
  buf[8] = char(0);
  buf[9] = char(0);
  buf[10] = char(8);
  buf[11] = char(0);
  buf[12] = char(0);
  buf[13] = char(0);
  buf[14] = char(0);
  buf[15] = char(0);
  buf[16] = char(0);
  buf[17] = char(0);
  buf[18] = char(0);
  buf[19] = char(0);
  buf[20] = char(0);
  buf[21] = char(0);
  buf[22] = char(0);
  buf[23] = char(0);
  buf[24] = char(0);
  buf[25] = char(0);
  buf[26] = char(0);
  buf[27] = char(0);
  buf[28] = char(0);// 00 40 63 e3 f0(ec) fd(c8)
  buf[29] = char(64);
  buf[30] = char(99);
  buf[31] = char(227);
  buf[32] = char(236);
  buf[33] = char(200);
  buf[34] = char(0);
  buf[35] = char(0);
  buf[36] = char(0);
  buf[37] = char(0);
  buf[38] = char(0);
  buf[39] = char(0);
  buf[40] = char(0);
  buf[41] = char(0);
  buf[42] = char(0);
  buf[43] = char(0);

  int s = sendto(sock, buf, sizeof(buf), 0, (sockaddr*)&addr, (socklen_t)tmpSize);
  if (s < 0)
  {
    perror("Error");
    return 0;
  }
  
  printf("Sended: %d\n", s);
  
  FILE* file = fopen("log", "w+");
  fwrite(buf, 1, sizeof(buf), file);
  fclose(file);
  
  char* chr = new char[1024];
  
  memset(chr, 0, 1024);
  
  struct sockaddr_in serverAddr;
  
  memset(&serverAddr, 0, sizeof(serverAddr));
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_port = htons(68);
  serverAddr.sin_addr.s_addr = INADDR_ANY;
  
  int serverTmp = sizeof(serverAddr);
  int sock2 = socket(PF_INET, SOCK_DGRAM, 0);

  printf("Server socket: %d\n", sock2);

  if (bind(sock2, (sockaddr*)&serverAddr, sizeof(serverAddr))!= 0)
  {
    perror("Bind");
    return 0;
  }
  
  int r = recvfrom(sock2, chr, sizeof(chr), 0, (sockaddr*)&tmpAddr, (socklen_t*)&tmpSize2);
  printf("Recieve: %d\n", r);
  
  shutdown(sock, 2);
  close(sock);

  return 0;
}

//=============================================================================




--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 27.4.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



сейчас пишет "Permission denied". root права имеются


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 27.4.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Порылся в инете и нашёл, что надо менять параметры сокетов.
Код

...
int sockBuf = 4096;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, sockBuf, sizeof(sockBuf));

sendto(...);
...

Permission denied действительно прошёл, всё отсылается smile, но вот ответа от сервака нет :-(
Может пакет не так формирую? Будем искать ошибку

Это сообщение отредактировал(а) Rickert - 27.4.2007, 08:50


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 27.4.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Всё, надо было ловить на том же 67 порту, что и отправлял, хотя в мануалаха везде указано, что мол на 68 ответы приходят.
Ответ корявый: "01 01 06 00" smile 
С пакетом что-то не так?

Это сообщение отредактировал(а) Rickert - 27.4.2007, 11:39


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 28.4.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Ладно, раз уж никто не знает, то такой вопрос: как откатать траффик, который идёт от проги, в то время как сеть ещё не поднята? То бишь, как поймать пакет, который программа пошлёт на 255.255.255.255, учитывая, что она не обладает ещё своим IP.
tcpdump не катит.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
GremlinProg
Дата 28.4.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Rickert @  27.4.2007,  10:45 Найти цитируемый пост)
int sockBuf = 4096;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, sockBuf, sizeof(sockBuf));

Здесь sockBuf должен быть типа BOOL т.е. принимать значения 1 или 0, сама опция булева. Но это так, к слову.
Цитата(Rickert @  28.4.2007,  07:27 Найти цитируемый пост)
как откатать траффик, который идёт от проги, в то время как сеть ещё не поднята?

а при чем тут дхцп? и самое главное, зачем?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Rickert
Дата 28.4.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



GremlinProg, затем чтобы поймать то, как они собрали первый пакет, чтобы понять, как его надо собирать smile


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
GremlinProg
Дата 28.4.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
ptr
Дата 28.4.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rickert, ну ты и писатель. Я запутался в бесконечных buf.

Цитата(GremlinProg @  28.4.2007,  13:50 Найти цитируемый пост)
Здесь sockBuf должен быть типа BOOL

Он под *nix пишет, а там int.

Цитата(Rickert @  28.4.2007,  08:27 Найти цитируемый пост)
tcpdump не катит.

А что так?


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.4.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(ptr @  28.4.2007,  19:30 Найти цитируемый пост)
Он под *nix пишет, а там int.

вижу, что не в форточках, но для сокетов это не принципиально.
к слову, в винде BOOL тот же инт, я имел ввиду его логическую сущность, а не символьную...


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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