Консультация № 139371
06.06.2008, 22:06
0.00 руб.
0 1 1
Здравствуйте.
1) Как послать широковещательный UDP-пакет с каждого сетевого интерфейса отдельно? Проблема в том, что когда компьютер с 2 сетевыми картами посылает такой пакет, IP-адрес отправителя он ставит одинаковый в обе подсети, проверял сниффером. Получается, что в одной из подсетей на запрос невозможно ответить. Поэтому 2 копии программы соединение установить могут не всегда, а только в том случае, если запрос посылается компьютером у которого 1 сетевой интерфейс - в этом случае обр. адрес будет подставлен точно. Код на всякий случай в приложении. Какие есть решения?
2) Как послать UDP-пакет не только на опред. порт, но и с конкретно заданного порта? Почему в структуре sockaddr нет исходящего порта?

Приложение:
SOCKET s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(6553);saddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);bind(s,(sockaddr*)&saddr,sizeof(sockaddr_in));BOOL SockOpt = TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&SockOpt,sizeof(SockOpt));sendto(s,(char *)&ch,4,0,(sockaddr*)&saddr,sizeof(sockaddr_in));

Обсуждение

давно
Академик
20764
1861
07.06.2008, 08:21
общий
это ответ
Здравствуйте, Blackie!
Свои параметры (адрес и порт) задаются с помощью bind, куда они и должны передаваться. Если там указать не INADDR_ANY и 0 то указанные значения и будут использоваться.
Кстати, свой порт вы указали, только не проверили прошла ли привязка. Она могла и не пройти, если порт уже к кому-либо привязан или некуда адрес привязать. А адрес не указали, поэтому сокет и привязывается (один раз, по bind()) к произвольному. Посылаются же пакеты в зависимости от адреса получателя в соответствии с таблицей маршрутизации.
Форма ответа