2015-03-05 3 views
0

Я хочу написать простой клиент DHCP (который будет работать через WLAN), и у меня возникла проблема с правильной отправкой исходного сообщения DHCP DISCOVER - он отправляется (я вижу его в Wireshark при захвате интерфейса WLAN), но исходный адрес адрес моего адаптера. Как установить IP-адрес на «0.0.0.0»?Как установить IP-адрес источника на 0.0.0.0?

Вот часть моего кода:

sockaddr_in src_addr; 
    memset(&src_addr, 0, sizeof(struct sockaddr_in)); 
    src_addr.sin_family = AF_INET; 
    src_addr.sin_port = htons(m_sport); 
    src_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    status = bind(m_sockfd, reinterpret_cast<sockaddr *>(&src_addr), sizeof(sockaddr_in)); 

Когда я пытаюсь src_addr.sin_addr.s_addr = inet_addr("0.0.0.0");, адрес источника по-прежнему устанавливается от eth0 (10.132 ...).

+0

Если вы используете Linux, настройки по умолчанию из брандмауэра не позволяют вам обманывать IP-адреса – Gizmo

+0

Зачем вам нужно установить IP на '0.0.0.0'? Это недопустимый IP-адрес и, вероятно, вызовет проблемы с Wireshark. – cybermonkey

+2

@ ʎǝʞuoɯɹǝqʎɔ '0.0.0.0' является допустимым IP-адресом. В контексте dhcp он используется, чтобы указать, что устройству еще не назначен IP-адрес. – HamZa

ответ

5

Ядро выполняет вашу службу, заполняя «бесплатно» адрес источника IP-адресом в интерфейсе выхода.

Если вы не хотите, чтобы вам, вероятно, пришлось использовать сырые сокеты и предоставить свой собственный IP-заголовок IP_HDRINCL. Ищите SOCK_RAW.


Простой способ обмануть через это, чтобы strace или truss ваш клиент DHCP и посмотреть, что он делает.