How to broadcast Message using UDP sockets locally?
I want to broadcast messages locally to many application. For that I thought UDP sockets is the best IPC, correct me if I am worng.
For this I am using the following codes:
The problem is that I have to pass IP like this 192.168.1.255 but in the real scenario there may not be eth0 interface, there will be only loopback. Then how can I achieve this?
3 Answers 3
The server should not be bound to an address you get from getaddrinfo , instead it should be bound to 127.255.255.255 (for the loopback interface).
![]()
Unix domain sockets don’t support multi-/broadcasting.
You can broadcast on the local interface 127.0.0.1.
While the original question doesn’t explicitly say so, I believe the original asker wanted to ‘broadcast’ to multiple applications running on the same operating-system instance (same computer to old timers).
This is supported by the use of ‘SO_REUSEADDR’ in the listener example, and followup comments by Yuvi, and finally a suggestion to use IP multicast.
The original question should be clarified.
I believe packet distribution with multiple-binders on a single UDP port varies between operating systems when using SO_REUSEADDR. My experience on recent Windows, is that a single ‘binder’ is exclusively given all packets until she releases her bind, at which time, another binder is chosen and presented all received packets, until she releases, and so on.
This apparently differs from recent Linux kernels, as explained in this link: https://stackoverflow.com/a/14388707/86375 That page appears to claim Linux will round-robin receives packets between multiple binders.
The end-result, if you hope to send-to-many using a single sent-datagrams as the original poster did, and you attempt to use IP unicast, not IP multicast, you may be disappointed. (My experience, and the link above show you can multi-bind, but that doesn’t imply multi-delivery of received datagrams, neither on Linux or Windows)
Как сделать broadcast рассылку сообщений по UDP используя Socket?
К нему подключаются клиенты, шлют что-то, он в отдельном потоке потихоньку это что-то слушает и реагирует.
Тут всё работает.
В какой-то момент времени нужно всем клиентам рассказать, что что-то произошло.
Я по наивности своей решил, что это делается вот так:
И получаю в этом месте исключение
Было у меня подозрение, что косяк в том, что сокет просто занят в данный момент времени прослушиванием, поэтому ему не до отправки. Но проверка показала, что это не так.
Прошу подсказки: куда копать?
Заранее всем спасибо за советы
- Вопрос задан более двух лет назад
- 503 просмотра
- Вконтакте

Сам спросил, сам ответил.
Оказывается, нужно было чуть внимательнее читать документацию, хотя там и не всё так очевидно.
Цитата с сайта майкрософт:
Ну и применять вместо Send нужно SendTo, просто ему вместо конкретного адреса в EndPoint передавать
Как послать бродкастный пакет udp
Нужно создать UDP сокет для прослушивания broadcast, который идет от железки.
При создании сокета в sockaddr_in нужно указывать порт железа (он известен), а ip адрес тоже железа должен быть?
Первый раз работаю с такой темой и путаюсь где чья информация должна быть указана.
Спасибо за помощь.
Как только происходит попытка создать сокет для UDP — сокет TCP сразу ломается (выдает 10093).
Добрый день. Пытаюсь сделать соединение, использующее два канала обмена данными — TCP для.
UDP Broadcast
Здравствуйте, написал программу которая с помощью UDP считает количество своих копий на локальной.
Broadcast UDP chat
Здравствуйте. Нужно реализовать чат на UDP с использованием широковещательных запросов (простейшее.
UDP Broadcast Network is unreachable
Пытаюсь отправить широковещательный пакет, но все время выдает Network is unreachable Сначала.
Сообщение было отмечено Horwood как решение
Решение
Сообщение от Horwood
В функции bind для UDP указываются локальные IP-адрес и порт. Локальные параметры — это параметры устройства, на котором запускается ваша программа.
У устройства может быть несколько IP-адресов. Грубо говоря, несколько сетевых карт и у каждой карты свой IP. Сокет может быть связан с одним локальным IP-адресом (сетевым интерфейсом) или сразу со всеми (INADRANY). Если сокет связан с одним сетевым интерфейсом, то общаться по сети он может только в рамках этого интерфейса. Если сокет связан сразу со всеми сетевыми интерфейсами, то общаться по сети он может в рамках любого доступного ему интерфейса. Укажите общую привязку, это более универсально.
Сокет должен быть связан с локальным портом. Отправляя кому-то что-то через сокет данные будут уходить от имени привязанного порта. Данные приходящие на устройство адресуются определенному порту, по порту определяется связанный с ним сокет и, в конечном счёте, программа принимающая эти данные.
Бродкастное сообщение рассылается на какой-то конкретный порт всех работающих в сети устройств. Принимающая такое сообщение программа должна создать сокет связанный с портом рассылки. Порт, с которого идёт рассылка бродкастного сообщения, может отличаться от порта рассылки — это разные порты.
Как отправить TCP или UDP пакет в Linux?

Часто при тестировании каких-либо приложений может возникнуть необходимость проверить, доходят ли определенные пакеты по udp/tcp до адресата, например, при проверке функционирования фаервола или же проверки работоспособности проброса портов. В данной статье будет описан простой способ это сделать с помощью командой строки.
Как отправить TCP пакет на определенный ip:порт в Linux
Для отправки tcp пакета на определенный IP адрес и определенный порт, можно воспользоваться следующей командой:
1.2.3.4 — это IP адрес, на который мы будем посылать наш tcp пакет.
12345 — это порт, на который мы будем посылать наш tcp пакет
Альтернативным вариантом может быть использование утилиты nmap:
Как отправить UDP пакет на определенный ip:порт в Linux
Для отправки udp пакета на определенный IP адрес и определенный порт, можно воспользоваться следующей командой:
1.2.3.4 — это IP адрес, на который мы будем посылать наш udp пакет.
12345 — это порт, на который мы будем посылать наш udp пакет
Альтернативным вариантом может быть использование утилиты nmap:
eth0 — название сетевого интерфейса, который мы будем прослушивать
12345 — номер порта
Name already in use
INaT / lab / 03-udp / lab03-udp.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
Copy raw contents
Copy raw contents
#. Изучить ключевые функции API сокетов. #. Научиться работать с UDP-сокетами в блокирующем режиме.
Требуется написать простую программу для обмена короткими текстовыми сообщениями по сети:
- При запуске программа запрашивает у пользователя IP-адрес и порт, с которых сможет в дальнейшем принимать сообщения.
- Пользователь выбирает, что нужно сделать: принять сообщение, отправить сообщение или завершить работу.
- Если выбран прием сообщения, программа ожидает, когда его пришлют на заданный ранее адрес и порт, после чего отображает сообщение вместе с адресом и портом отправителя.
- Если выбрана отправка сообщения, пользователь вводит адрес получателя, порт получателя и текст сообщения, после чего оно отправляется.
- Выполнение возвращается к пункту 2.
Пример работы (ввод показан жирным, пример вывода показан курсивом).
Enter listening address:
host: 0.0.0.0
port: 1234
(R)eceive, (s)end, or (q)uit? s
Enter target address:
host: 192.168.1.13
port: 2345
Message: Hello!
(R)eceive, (s)end, or (q)uit? r (выполнение приостанавливается)
From host: 192.168.1.14
From port: 4321
Message: test. test. test.
(@) Создайте новый проект lab03-udp и подготовьте программу к работе с API сокетов, как это делалось на предыдущей ЛР.
Параметр -static указывает собирать программу статически, то есть код встроить полный код функций стандартной библиотеки в исполняемый файл, а не загружать эти функции из внешней библиотеки. Благодаря этому, программу можно будет запускать извне IDE независимо от наличия и местоположения стандартной библиотеки (DLL).
Сокет — это устройство для обмена данными по сети, а в программе — переменная-идентификатор такого устройства.
Сокет создается функцией socket() , при этом определяются его основные свойства:
C каким семейством адресов (address family) он будет работать: IPv4, IPv6 или другим. Доступные варианты зависят от платформы: например, в Linux есть локальные сокеты (UNIX domain sockets), отсутствующие в Windows, но там, с другой стороны, через сокеты доступна связь по инфракрасному порту или Bluetooth.
Какие возможности предоставляет сокет. Основные доступные варианты: SOCK_DGRAM — дейтаграммные сокеты и SOCK_STREAM — потоковые сокеты (см. ниже).
Какой протокол транспортного уровня будет использоваться: UDP, TCP или иной. Фактически, доступные протоколы определяются предыдущим пунктом.
Дейтаграммные сокеты ( SOCK_DGRAM ) обычно используют UDP (user datagram protocol) и предоставляют такие возможности:
Сохранение границ между сообщениями (message bounds preservation): если программа отправляет два сообщения (например, 1 КБ и 1 КБ), они будут получены по отдельности, т. е. не могут быть «склеены» в 2 КБ.
Ограниченный размер сообщения: зависит от настроек сети, но в типичном случае IPv4 и локальной сети Ehternet — 1472 байта.
Не гарантируется ни доставка (любая дейтаграмма может быть не дойти), ни порядок доставки (дейтаграммы могут быть получены не в порядке отправки). С другой стороны, если сообщение доставляется, то целиком.
Нет соединений. Во-первых, перед отправкой или получением данных не нужно устанавливать соединение (обмениваться служебными пакетами). Во-вторых, каждая дейтаграмма может быть отпралена отдельному получателю или получена от нового источника.
(@) Создайте дейтаграммный сокет, работающий в сетях IPv4 по UDP:
(@) Проверьте наличие ошибок. Согласно документации, в случае неудачи функция socket() возвращает INVALID_SOCKET .
Хост и порт можно ввести как обычные переменные, строку и число:
Объявим переменную-результат. В документации сказано, что все неиспользуемые поля должны быть обнулены. Для этого можно всю память, занятую структурой, сначала заполнить нулями с помощью функции memset() . Помимо заполнителя ( 0 ) она принимает адрес и размер заполняемой области памяти.
Член sin_family структуры sockaddr_in всегда равен AF_INET .
IP-адрес (член sin_addr ) представлен структурой in_addr с единственным полем — четырехбайтовым целым s_addr . Это число содержит байты IP-адреса в сетевом порядке байт. Получить такое число из строки ( const char* ) с IP-адресом можно функцией inet_addr() . Для передачи ей из переменной host извлекается указатель на хранимые символы:
Порт в структуре-адресе хранится в сетевом порядке байт.
Внимание! Если не сделать перевод порядка байт, программа может отработать без ошибок, но не с тем портом, который ввел пользователь. Например, введенный 1088 ( 0x40 , 0x04 в little-endian) будет воспринят как 16388 ( 0x4004 ).
(@) Привяжите сокет к выбранному адресу:
(@) Проверьте наличие ошибок, так как привязка может не удаться:
Здесь используются функции do_send() и do_receive() , в которые будет заключен код для отправки и получения сообщений. Нужно объявить их перед main() :
и реализовать ниже main() , пока пустыми, подобно ЛР № 2:
(@) Объявление и пустую реализацию для do_receive() напишите самостоятельно.
Для приема данных предназначена функция recvfrom() :
При ее вызове выполнение программы приостанавливается до тех пор, пока нельзя будет завершить операцию, то есть пока не прибудут данные. Это и называется блокирующим режимом работы сокетов. То же относится и к остальным операциям, но для recvfrom() это наиболее актуально. Если данные пришли раньше, чем была вызвана recvfrom() , она успешно считает их сразу же из буфера ОС. Но если данные приходят очень быстро, буфер ОС переполнится, и часть дейтаграмм будет сброшена прежде, чем быть считанными через recvfrom() .
- привязанный к адресу и порту сокет;
- адрес буфера, куда будут записаны принятые данные;
- наибольшее количество байт, которые функция сможет записать в буфер;
- (опционально, можно передать 0 ) флаги для особых режимов приема;
- (опционально, можно передать NULL ) указатель на структуру, которая может быть заполнена адресом отправителя, и на переменную, содержащую размер этой структуры.
Наибольший размер дейтаграммы заведомо не может превышать размер кадра Ehternet, равный 1536 (на самом деле, еще меньше):
Вызовем функцию приема данных с минимально необходимыми параметрами:
Возвращаемое значение result может быть:
- положительным — тогда это количество байт, записанных в буфер в результате успешного приема дейтаграммы;
- нулевым — в случае прихода пустой дейтаграммы (может означать иное в зависимости от дополнительных флагов);
- отрицательным — если произошла ошибка.
В случае успеха следует распечатать прибывшие данные:
(@) Напишите код, проверяющий значение result перед тем, как использовать его. В частности, если result отрицательна, вместо печати данных нужно получить и отобразить код ошибки (и завершить программу).
Как проверить, что прием данных работает, если отправка еще не написана?
Существует стандартная (в *nix) программа netcat ( nc , ncat ), позволяющая открыть сокет и отправлять туда данные со стандартного ввода. На Windows netcat поставляется в составе пакета программ Nmap.
(@) Запустите командную строку и добавьте путь к netcat в список путей, по которым ОС ожидает найти запускаемые программы: set PATH=D:\Soft\Nmap;%PATH%
Примечание. Вне лаборатории путь установки Nmap может быть другим.
(@) Запустите свою программу. В качестве адреса привязки укажите 127.0.0.1, а порт привязки — 1234. Выберите режим приема ( r ).
(@) Отправьте проверочное сообщение в свою программу при помощи ncat :
Ключ -u означает работу по UDP.
Утилита позволяет не только отправлять, но и принимать данные при запуске с ключом -l (listen):
(@) Убедитесь, что сообщение доставлено в программу. Зафиксируйте команду вызова ncat и вывод собственной программы для отчета.
О специальных адресах. Из лекций известно, что и 127.0.0.1, и 0.0.0.0 являются специальными адресами IP. Адрес 127.0.0.1 означает «данный узел» и действителен только в пределах машины. Таким образом, к 127.0.0.1 можно привязать сокет, но он сможет принимать только пакеты, отправленные с той же машины. Адрес 0.0.0.0 означает «все интерфейсы данной машины», то есть сокет, привязанный к 0.0.0.0, может получать пакеты, направленные с других машин на внешний адрес данной (наподобие 192.168.0.2) или с той же машины на 127.0.0.1. Указывать сам 0.0.0.0 в качестве адреса получателя нельзя.
Отправка данных в функции do_send() требует ввода адреса получателя:
Для отправки дейтаграмм используется функция sendto() :
Принципиально sendto() может блокироваться, хотя реально такие условия наступают в редких случаях за рамками ЛР.
- сокет, через который будут отправляться данные (привязка не обязательна);
- указатель на буфер с передаваемыми данными;
- размер передаваемых данных, находящихся по адресу буфера;
- (опционально, можно передать 0 ) флаги для особых режимов отправки;
- указатель на структуру, содержащую адрес назначения;
- размер структуры с адресом назначения.
Данные для отправки — сообщение, вводимое с клавиатуры:
Функция sendto() вызывается так:
Функция может вернуть:
- неотрицательное количество отправленных байт из буфера (оно может быть меньше указанного, если буфер больше максимального размера дейтаграммы);
- отрицательное число в случае ошибки.
(@) Напишите код, проверяющий результат отправки данных:
(@test) Запустите два экземпляра своей программы. Настройте их слушать разные порты на адресе 0.0.0.0. Проверьте работу программы:
Получение адреса отправителя после приема
Как было сказано, функция recvfrom() позволяет получить адрес и порт отправителя прибывшей дейтаграммы. Это нужно и важно потому, что у каждой дейтаграммы может быть иной источник.
Для этого предпоследним параметром необходимо ей передать адрес структуры sockaddr_in (в случае IPv4), поля которой будут заполнены адресом отправителя. Функция позволяет работать не только с IPv4, поэтому указатель принимает не на sockaddr_in , а на структуру sockaddr , поэтому необходимо приведение типов.
Последний параметр — указатель на целочисленную переменную. Перед вызовом функции эта переменная должна быть равна размеру структуры sockaddr_in . После вызова recvfrom() ее значение изменится на размер структуры-адреса, которая заполнена. В нашем случае это значит, то значение либо не изменится (была подготовлена структура sockaddr_in и она же заполнена), либо станет нулевым (если адрес не удалось определить, что маловероятно).
(@) Измените функцию do_receive() , добавив определение адреса отправителя:
Для пользователя необходимо напечатать поля sin_addr и sin_port .
Для перевода поля sin_addr (4 байта) в текстовый вид IP-адреса можно воспользоваться функцией inet_ntop() , которая в Windows называется InetNtop() . Ее параметры:
- семейство адресов ( AF_INET для IPv4);
- указатель на байты адреса (адрес поля address.sin_addr );
- указатель на буфер символов, куда будет записан результат;
- максимальное количество байт буфера, которые функция может заполнить.
Последняя пара параметров аналогична буферу для данных recvfrom() и его длине. Размер буфера должен быть не меньше INET_ADDRSTRLEN .
В Windows XP доступна только inet_ntoa() . Последняя является более простой и многие примеры в интернете ее используют. Ей не требуется передавать буфер для результата, потому что она использует скрытую глобальную переменную, указатель на которую возвращает. Это делает inet_ntoa() небезопасной для реальных приложений, работающих с несколькими сокетами одновременно (как в ЛР № 6), и в любом случае, чтобы сохранить ее результат, его нужно копировать.
(@) Воспользуйтесь inet_ntop() / InetNtop() , а если они недоступны — inet_ntoa() , чтобы напечатать IP-адрес отправителя.
Поле sin_port заполняется в сетевом порядке байт, поэтому перед выводом порядок байт нужно изменить функцией ntohs() .
(@) Добавьте печать порта отправителя в функцию do_receive() .
(@) Повторите эксперимент из пункта @test. Убедитесь, что порт отправителя совпадает с выбранным портом привязки в каждом случае.
Широковещательная рассылка (broadcast)
Широковещательная рассылка позволяет отправить дейтаграмму всем узлам локальной сети, ведущим прием на определенном порту. Для этого достаточно указать адресом назначения 255.255.255.255. Однако перед этим необходимо (один раз) настроить сокет на возможность отправки таких дейтаграмм.
Настройка различных опций сокетов выполняется setsockopt() :
- настраиваемый сокет;
- уровень (категория) и имя (идентификатор) опции; опции с их уровнями и идентификаторами перечислены и описаны в документации;
- указатель на новое значение опции и размер значения по этому адресу.
Для включения широковещательной рассылки используется опция SO_BROADCAST уровня SOL_SOCKET . Ее значение — целое число, 1 (вкл) или 0 (выкл). Включение широковещательной рассылки для сокета не мешает вести обычную, поэтому в учебной программе можно включать ее безусловно.
(@) Перед началом основного цикла работы добавьте включение широковещательной рассылки для сокета. int enabled = 1; setsockopt(channel, SOL_SOCKET, SO_BROADCAST, (const char*)&enabled, sizeof(enabled));
(@) Добавьте обработку возможных ошибок вызова setsockopt() .
(@) На двух компьютерах (договоритесь с коллегой) запустите по экземпляру программы, привязанных к адресу 0.0.0.0 и одному и тому же порту, на прием. На одном из этих компьютеров запустите еще один экземпляр, из которого отправьте широковещательную дейтаграмму на порт принимающих экземпляров. Зафиксируйте вывод всех экземпляров в отчете.
Общее контрольное задание

Добавьте в программу возможность только проверить, поступала ли дейтаграмма на адрес, к которому привязан сокет, и если нет, не ждать ее прибытия. Для этого добавьте четвертое действие c (check) наряду с r , s и q . Если дейтаграмма прибыла, оно должно делать то же, что и r , иначе печатать сообщение о том, что новых дейтаграмм нет. Это реализуется через специальный флаг recvfrom() и обработку ее результата. Демонстрацию работы нового режима занесите в отчет, снабдив комментариями, в какие моменты выполнялись проверки и отправлялись дейтаграммы.
#. Что в API сокетов называют семейством адресов? Приведите примеры семейств и адресов, относящихся к ним.
#. Какие сокеты называют дейтаграммными (перечислите их особенности)?
#. Какие сокеты называют блокирующими? Приведите примеры, как это проявляется.
#. Назовите последовательность операций с сокетом, которые необходимо совершить для приема дейтаграммы, и соответствующие функции API.
#. Назовите последовательность операций с сокетом, которые необходимо совершить для широковещательной рассылки дейтаграмм, и соответствующие функции API.
#. Опишите поля структуры sockaddr_in и способы их заполнения.
#. Укажите назначение специальных адресов IPv4 и диапазонов: 127.0.0.1, 0.0.0.0, 255.255.255.255, 172.16.0.0/12.
#. Какие порты называют привилегированными? Приведите примеры известных привилегированных портов не из описания ЛР.
#. Что произойдет, если попытаться принять дейтаграмму, предоставив recvfrom() буфер недостаточно большого размера? Ответ обоснуйте документацией.
#. Что произойдет, если попытаться отправить sendto() дейтаграмму большего размера, чем допустимо в данной сети? Ответ обоснуйте документацией.
#. Приведите две команды: одна запускает netcat на прием данных по UDP на порту 52341, вторя шлет дейтаграмму на этот порт через netcat же.
How to broadcast Message using UDP sockets locally?
I want to broadcast messages locally to many application. For that I thought UDP sockets is the best IPC, correct me if I am worng.
For this I am using the following codes:
The problem is that I have to pass IP like this 192.168.1.255 but in the real scenario there may not be eth0 interface, there will be only loopback. Then how can I achieve this?
3 Answers 3
The server should not be bound to an address you get from getaddrinfo , instead it should be bound to 127.255.255.255 (for the loopback interface).
![]()
Unix domain sockets don’t support multi-/broadcasting.
You can broadcast on the local interface 127.0.0.1.
While the original question doesn’t explicitly say so, I believe the original asker wanted to ‘broadcast’ to multiple applications running on the same operating-system instance (same computer to old timers).
This is supported by the use of ‘SO_REUSEADDR’ in the listener example, and followup comments by Yuvi, and finally a suggestion to use IP multicast.
The original question should be clarified.
I believe packet distribution with multiple-binders on a single UDP port varies between operating systems when using SO_REUSEADDR. My experience on recent Windows, is that a single ‘binder’ is exclusively given all packets until she releases her bind, at which time, another binder is chosen and presented all received packets, until she releases, and so on.
This apparently differs from recent Linux kernels, as explained in this link: https://stackoverflow.com/a/14388707/86375 That page appears to claim Linux will round-robin receives packets between multiple binders.
The end-result, if you hope to send-to-many using a single sent-datagrams as the original poster did, and you attempt to use IP unicast, not IP multicast, you may be disappointed. (My experience, and the link above show you can multi-bind, but that doesn’t imply multi-delivery of received datagrams, neither on Linux or Windows)
Как послать широковещательный запрос в локальную сеть?
При попытке сделать ClientSocket->Open(); выдает сообщение «Asynchronous socket error 10049».
Может быть компонент просто не умеет делать такие запросы?
Я смотрел на другой чат через файрвол, он использует в качестве адреса вообще 255.255.255.255 как он это делает не понятно но работает.
в качестве адреса вообще 255.255.255.255 как он это делает не понятно но работает.
Это совсем круто. По всему Инету на всю планету.
При попытке сделать ClientSocket->Open(); выдает сообщение «Asynchronous socket error 10049».
Может быть компонент просто не умеет делать такие запросы?
Я смотрел на другой чат через файрвол, он использует в качестве адреса вообще 255.255.255.255 как он это делает не понятно но работает.
А броадкаст запросы в сети разрешены? Может в этом и есть вся загвоздка т.к. разрешать такое опасно.
Ну я так понимаю, что если чужой чат работает — значит броадкаст запросы разрешены.
При попытке сделать ClientSocket->Open(); выдает сообщение «Asynchronous socket error 10049».
Может быть компонент просто не умеет делать такие запросы?
Я смотрел на другой чат через файрвол, он использует в качестве адреса вообще 255.255.255.255 как он это делает не понятно но работает.
Штука в том, что широковещательная передача использует протокол не TCP (как я понимаю у тебя так), а UDP. Соответстенно никакого соединения не производится.
бродкасты не ходят через маршрутизаторы.
Grom2025читайте
http://www.zeiss.net.ru/docs/technol/tcpip/tcp12.htm
сначала надо изучить основы. а потом чаты писать. это кстати ко всем относится.
и я не пойму, почему бы вам не использовать NetBIOS имена компов?
а почему? и как их запретить?
Ошибочка. я такого не постил. Это не мое. А броадкасты через маршрутизаторы действительно не ходят.
да я заметил. уже исправился.
а если действительно не ходят пугать человека зачем? дезинформация и саботаж.
да я заметил. уже исправился.
а если действительно не ходят пугать человека зачем? дезинформация и саботаж.
Согласен ну уж дюже крутой IP. Не люблю я такие адреса.
хм. вы меня пугаете. это прекрасный подход. вы мне напоминаете одного знакомого, который говорил, что нельзя ставить IP адрес машины 10.255.255.1 — мол «это против общепринятых правил»
Да нет. Против адреса такого я вобщем ничего не имею, но был прецендент,стыдно но спутал с маской 255.255.255.255 (правда я тогда только начинал сетями заниматься).
а маска вам такая чем не нравиться? 😉
а маска вам такая чем не нравиться? 😉
Всем нравиться. Просто смотрел исходный код и в течении многих часов не мог понять почему вместо адреса маска стоит, думал ошибка, а ошибка была совсем в другом месте. Много времени потратил ни на что. Потом правда ошибку нашел. Вот и не люблю я такие адреса.
Благодарю за ссылку! Изучаю !-)
А какие компоненты в Билдере могут работать через UDP? (идиотский вопрос но чат бы хотелось доделать до нового года, а у меня и без него завал) Может у кого примерчик есть?
Благодарю за ссылку! Изучаю !-)
А какие компоненты в Билдере могут работать через UDP? (идиотский вопрос но чат бы хотелось доделать до нового года, а у меня и без него завал) Может у кого примерчик есть?
Это правда из Билдер6, но в пятерке наверное тоже есть:
TUdpSocket is the UDP component.
Use TUdpSocket to create UDP-based applications. Add a TUdpSocket object to a form or data module to turn an application into a UDP/IP client and server. TUdpSocket specifies a desired connection to a UDP/IP server, manages the connection when it is open, and terminates the connection when the application is through. It also listens for requests for UDP/IP connections from other machines and establishes connections when requests are received.
Пардон! Видимо я где-то крепко торможу вследствии недостатка (вернее отсутствия в этой области) практики, но:
Издательство «БХВ-Петербург», 2003 год, книга «Протоколы интернета» Александр Филимонов. Страница 79, «Способы защиты от атак с использованием ICMP Echo Request/Reply». Цитата:
«В качестве одного из такий эффективных мероприятий можно использовать запрещение приема и распространения сообщений типа Direct Broadcast. Эта мера является достаточно эфективной и простой для реализации. Использование данной меры рекомендовано документом, в соответствии с которым должны строиться правила функционирования маршрутизаторов в сети IP RFC — 1122. в Частности, в этом документе указано, что сообщения ICMP Echo Request типа direct broadcast, направленные в его адрес, могут быть уничтожены без формирования какого-либо диагностического сообщения.»
Вышеприведенное наглая ложь?
Простите за наивный вопрос, а как получить те самые заветные NetBIOS имена?
Простите за наивный вопрос, а как получить те самые заветные NetBIOS имена?
API-шная функция BOOL GetComputerName(LPTSTR lpszName, LPDWORD lpdwBuffer). Возвращает имя netbios локального компьютера. Если используется ДНС нужна функция GetComputerNameEx
Первый параметр — указатель на буфер, в который поступает имя системы. Размер буфера должен быть минимум MAX_COMPUTERNAME_LENGTH + 1. Второй параметр — указатель на адрес, по которому находится определенное число символов в буфере до выполнения функции, а так-же число скопированных символов после выполнения.
При удаче возвращается TRUE.
отнюдь. просто вы невнимательно читали написанное:
как я уже писал маршрутизаторы действительно не пропускают бродкасты. опять же внимательно перечитав этот отрывок, вы поймете, что «запрещение» бродкастов происходит на сетевом уровне. в пределах же локальной сети, не разбитой маршрутизаторами, широковещательный траффик ограничить можно только установкой управляемых свичей 3-го уровня и созданием VLAN. в этом случае свичами будет выполняться уже не коммутация (канальный уровень), а маршрутизация между VLAN. но в пределах одной VLAN — широковещательные запросы ходить будут по прежнему.
я ответил на ваш вопрос?
Ну ладно получил я свой netbios name, чем мне это поможет, имен остальных компьютеров я не знаю
код в BCB5 выглядит вот так:
Да — big спасиб! Не сказать, что не внимательно читал. Просто не понял сразу, чем отличается приведенный случай от обсуждаемого здесь. Теперь дошло. Трудновато бывает все осмысливать только по книжкам :(.
Еще раз спасибо.
Ну ладно получил я свой netbios name, чем мне это поможет, имен остальных компьютеров я не знаю
А дальше отослать широковещательное сообщение с собственными координатами. И пусть остальные компьютеры его ловят и обрабатывают, отвечают tcp-сообщениями.
Спасибо, понял. Теперь остаётся вопрос как послать широковещательный запрос, пробовал на компоненте TNMUDP, файрвол показывает соединение UDP ip 255.255.255.255 (192.168.1.255 . ) пробовал всякие адреса, запрос всё равно не возвращается. (
Упс извиняюсь сейчас попробовал с адресом ip 192.168.1.255 запрос вернулся как и надо было.
Спасибо Nick_M. Но всётаки интересно почему не проходит ip 255.255.255.255?
P/S Всех с новым годом.
Спасибо, понял. Теперь остаётся вопрос как послать широковещательный запрос, пробовал на компоненте TNMUDP, файрвол показывает соединение UDP ip 255.255.255.255 (192.168.1.255 . ) пробовал всякие адреса, запрос всё равно не возвращается. (
Упс извиняюсь сейчас попробовал с адресом ip 192.168.1.255 запрос вернулся как и надо было.
Спасибо Nick_M. Но всётаки интересно почему не проходит ip 255.255.255.255?
P/S Всех с новым годом.
Кстати UDP-пакеты могут по ходу теряться.
Вообще если есть возможность организовать сервер, то лучше это сделать. Отпадает необходимость в широковещательных пакетах.
потому что теряться могут и TCP пакеты. а в локальной сети, о которой мы говорим. какова должна быть загрузка сети, чтобы UDP не смог доставить пакет.
Настоятельно рекомендую приобрести книгу
«Эффективное программирование TCP/IP»
из серии «библиотека программиста»
там шаг за шагом в лабораторных работах подводят к пониманию работы протоколов.
В часности есть наглядый пример того, что потери пакетов не всегда зависят от пропускной пособности сети: возможы потери пакетов даже когда клиент и сервер работают на одной машине.
На прочтение книги потеряешь неделю, но
без этого написать устойчиво работающюю сетевую программу нельзя.
Насчет чата по UDP —
IMHO нафига это надо ?
очень скоро у тебя появятся пользователи с ноутбуками, подключающимися через интернет
и хорошо было-бы , чтобы они могли обмениваться сообщениями с офиными компьютерами,
а еще через некоторое время поятвится второй офис, он то-же должен будет обмениваться сообщениями
и тут вспомни про маршрутизаторы 🙂
Обычное TCP соединение легко проходит через прокси -сервера: на Server/Client Socket писать надо.
Решение проблемы динамических адресов:
-1-
Выделить в сети сервер не так уж это сложно и страшно 🙂
-2-
DHCP настроить на выдачу адресов не в cлучайном порядке, а по MAC — адресам — каждому MAC — всегда только свой IP. Получится у каждого компа Всегда одинаковый IP, назанчаемый динамически.
-3-
Сколько компов в сети ? 10-25 ?
что мешает выполнить автоматический поиск чат-сервера в выбраном диапазоне адресов?
Времени займет менее 1 сек.
динамически создать
25 асинхронных сокетов , настроеных на попытку соединения с разными IP, когда один из них соединится, все остальные прибить.