Пишу DHCP-сервер на С++ и столкнулся с неожиданной проблемой: не могу отправить широковещательный пакет.
Есть сокет, висящий на адресе INADDR_ANY (т. е. 0.0.0.0) и 67 порту. У этого сокета включена опция для работы с широковещательными пакетами (через setsockopt()). Широковещательные сообщения он получает превосходно, но вот отправить что-либо широковещательно не может. Как быть? Приведу простой тестовый пример:
Код: Выделить всё
int main()
{
int mySocket = socket(AF_INET, SOCK_DGRAM, 0);
if (mySocket < 0)
{
return -1;
}
int enableBroadcast = 1;
if (setsockopt(mySocket, SOL_SOCKET, SO_BROADCAST, &enableBroadcast,
sizeof(enableBroadcast)) < 0)
{
close(mySocket);
return -1;
}
sockaddr_in myAddress;
myAddress.sin_family = AF_INET;
myAddress.sin_port = htons(67);//вешаем на порт
myAddress.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(mySocket, (sockaddr*) &myAddress, sizeof(myAddress)) < 0)
{
close(mySocket);
return -1;
}
sockaddr_in to;
to.sin_family=AF_INET;
to.sin_port=htons(68);
to.sin_addr.s_addr=htonl(INADDR_BROADCAST);
socklen_t toLen=sizeof(to);
char *mess="trololo";
int n=sendto(mySocket, mess, 7, 0, (sockaddr*) &to, toLen);
return 0;
}С "настоящего" адреса 192.168.0.1 я могу отправить широковещательное сообщение без проблем, но не могу получать их. А связать сокеты одновременно и к 0.0.0.0:67, и к 192.168.0.1:67 невозможно
P.S. netstat показывает, что стандартный линуксовый dhcp-сервер висит на 0.0.0.0:67, но отправляет как-то с 192.168.0.1:67 (вижу через сниффер wireshark).