Как послать широковещательный запрос в локальную сеть?
работающий в локальной сети, запускать отдельный сервер(програмный) под чат незя, на socket'ах
пробовал но не могу определить кто подключен в
данный момент да и вообще, отправлять запросы
на список IP тоже не вариант т.к. IP раздаёт winroute в случайном порядке. Что можно сделать!
Есть задача, дописать в программу простенький чат,
работающий в локальной сети, запускать отдельный сервер(програмный) под чат незя, на socket'ах
пробовал но не могу определить кто подключен в
данный момент да и вообще, отправлять запросы
на список IP тоже не вариант т.к. IP раздаёт winroute в случайном порядке. Что можно сделать!
Маска сети извесна? Тогда послать сообщение на последний адрес в сети. Это и будет броадкаст. Например сеть 192.168.0.0/255.255.255.0 Адрес для широковещательных сообщений: 192.168.0.255
Маска сети извесна? Тогда послать сообщение на последний адрес в сети. Это и будет броадкаст. Например сеть 192.168.0.0/255.255.255.0 Адрес для широковещательных сообщений: 192.168.0.255
При попытке сделать 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. Соответстенно никакого соединения не производится.
Это совсем круто. По всему Инету на всю планету.
бродкасты не ходят через маршрутизаторы.
Штука в том, что широковещательная передача использует протокол не TCP (как я понимаю у тебя так), а UDP. Соответстенно никакого соединения не производится.
совершенно верно.
Grom2025читайте
http://www.zeiss.net.ru/docs/technol/tcpip/tcp12.htm
сначала надо изучить основы... а потом чаты писать. это кстати ко всем относится.
и я не пойму, почему бы вам не использовать NetBIOS имена компов?
А броадкаст запросы в сети разрешены? Может в этом и есть вся загвоздка т.к. разрешать такое опасно.
а почему? и как их запретить?
совершенно верно. только вот скажите, как в сети можно запретить броадкасты??? (это к предыдущему вашему посту)
Ошибочка. я такого не постил. Это не мое. А броадкасты через маршрутизаторы действительно не ходят.
Ошибочка. я такого не постил. Это не мое. А броадкасты через маршрутизаторы действительно не ходят.
да я заметил. уже исправился.
а если действительно не ходят пугать человека зачем? дезинформация и саботаж.
да я заметил. уже исправился.
а если действительно не ходят пугать человека зачем? дезинформация и саботаж.
Согласен ну уж дюже крутой IP. Не люблю я такие адреса.
Не люблю я такие адреса.
хм... вы меня пугаете. это прекрасный подход. вы мне напоминаете одного знакомого, который говорил, что нельзя ставить IP адрес машины 10.255.255.1 - мол "это против общепринятых правил"
хм... вы меня пугаете. это прекрасный подход. вы мне напоминаете одного знакомого, который говорил, что нельзя ставить IP адрес машины 10.255.255.1 - мол "это против общепринятых правил"
Да нет. Против адреса такого я вобщем ничего не имею, но был прецендент,стыдно но спутал с маской 255.255.255.255 (правда я тогда только начинал сетями заниматься).
Да нет. Против адреса такого я вобщем ничего не имею, но был прецендент,стыдно но спутал с маской 255.255.255.255 (правда я тогда только начинал сетями заниматься).
а маска вам такая чем не нравиться? ;)
а маска вам такая чем не нравиться? ;)
Всем нравиться. Просто смотрел исходный код и в течении многих часов не мог понять почему вместо адреса маска стоит, думал ошибка, а ошибка была совсем в другом месте. Много времени потратил ни на что. Потом правда ошибку нашел. Вот и не люблю я такие адреса.
Grom2025читайте
http://www.zeiss.net.ru/docs/technol/tcpip/tcp12.htm
сначала надо изучить основы... а потом чаты писать. это кстати ко всем относится.
и я не пойму, почему бы вам не использовать NetBIOS имена компов?
Благодарю за ссылку! Изучаю !-)
А какие компоненты в Билдере могут работать через UDP? (идиотский вопрос но чат бы хотелось доделать до нового года, а у меня и без него завал) Может у кого примерчик есть?
Благодарю за ссылку! Изучаю !-)
А какие компоненты в Билдере могут работать через UDP? (идиотский вопрос но чат бы хотелось доделать до нового года, а у меня и без него завал) Может у кого примерчик есть?
Это правда из Билдер6, но в пятерке наверное тоже есть:
TUdpSocket is the UDP component.
Unit
Sockets
Description
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 имена?
Простите за наивный вопрос, а как получить те самые заветные NetBIOS имена?
API-шная функция BOOL GetComputerName(LPTSTR lpszName, LPDWORD lpdwBuffer). Возвращает имя netbios локального компьютера. Если используется ДНС нужна функция GetComputerNameEx
Первый параметр - указатель на буфер, в который поступает имя системы. Размер буфера должен быть минимум MAX_COMPUTERNAME_LENGTH + 1. Второй параметр - указатель на адрес, по которому находится определенное число символов в буфере до выполнения функции, а так-же число скопированных символов после выполнения.
При удаче возвращается TRUE.
Вышеприведенное наглая ложь?
отнюдь. просто вы невнимательно читали написанное:
как я уже писал маршрутизаторы действительно не пропускают бродкасты. опять же внимательно перечитав этот отрывок, вы поймете, что "запрещение" бродкастов происходит на сетевом уровне. в пределах же локальной сети, не разбитой маршрутизаторами, широковещательный траффик ограничить можно только установкой управляемых свичей 3-го уровня и созданием VLAN. в этом случае свичами будет выполняться уже не коммутация (канальный уровень), а маршрутизация между VLAN. но в пределах одной VLAN - широковещательные запросы ходить будут по прежнему.
я ответил на ваш вопрос?
API-шная функция BOOL GetComputerName(LPTSTR lpszName, LPDWORD lpdwBuffer). Возвращает имя netbios локального компьютера. Если используется ДНС нужна функция GetComputerNameEx
Первый параметр - указатель на буфер, в который поступает имя системы. Размер буфера должен быть минимум MAX_COMPUTERNAME_LENGTH + 1. Второй параметр - указатель на адрес, по которому находится определенное число символов в буфере до выполнения функции, а так-же число скопированных символов после выполнения.
При удаче возвращается TRUE.
Ну ладно получил я свой netbios name, чем мне это поможет, имен остальных компьютеров я не знаю
код в BCB5 выглядит вот так:
//зачем мне пришлось сделать вот так?
_COMPUTER_NAME_FORMAT aa;
wchar_t cname[300];
if(GetComputerNameExW(aa,cname,&qwe))
{
RzEdit1->Text = cname;
}
else
{
RzEdit1->Text = "error";
};
я ответил на ваш вопрос?
Да - big спасиб! Не сказать, что не внимательно читал. Просто не понял сразу, чем отличается приведенный случай от обсуждаемого здесь. Теперь дошло. Трудновато бывает все осмысливать только по книжкам :(.
Еще раз спасибо.
Ну ладно получил я свой netbios name, чем мне это поможет, имен остальных компьютеров я не знаю
А дальше отослать широковещательное сообщение с собственными координатами. И пусть остальные компьютеры его ловят и обрабатывают, отвечают tcp-сообщениями.
А дальше отослать широковещательное сообщение с собственными координатами. И пусть остальные компьютеры его ловят и обрабатывают, отвечают 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-пакеты могут по ходу теряться...
Вообще если есть возможность организовать сервер, то лучше это сделать. Отпадает необходимость в широковещательных пакетах.
Кстати 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, когда один из них соединится, все остальные прибить.
Настоятельно рекомендую приобрести книгу
"Эффективное программирование TCP/IP"
из серии "библиотека программиста"
там шаг за шагом в лабораторных работах подводят к пониманию работы протоколов.
В часности есть наглядый пример того, что потери пакетов не всегда зависят от пропускной пособности сети: возможы потери пакетов даже когда клиент и сервер работают на одной машине.
На прочтение книги потеряешь неделю, но
без этого написать устойчиво работающюю сетевую программу нельзя.
молодца! я ее уже давно всем рекомендую :) правда я бы еще рекомендовал почитать TCP/IP Illustrated Стивенса...
потому что теряться могут и TCP пакеты. а в локальной сети, о которой мы говорим... какова должна быть загрузка сети, чтобы UDP не смог доставить пакет???
TCP-пакеты конечно-же могут теряться, но тогда произойдет повторная отправка без участия программы.
TCP-пакеты конечно-же могут теряться, но тогда произойдет повторная отправка без участия программы.
повторяю - в локальной сети вероятность потери ничтожна.
Насчет UDP... вероятность потери пакетов все же есть, были реальные опыты которые это показывают, даже без сети (на одной машине)...
И в конце концов.. что такое TCP? это усовершеннствованый так сказать UDP, который поддерживает постоянное соединение и реализует механизм гарантированной доставки пакетов (в отличие от UDP), в UDP тебе придется это делать самому...
Вообще лучше конечно сделать выделенный сервер и не парится, в итоге ты все равно к этому придешь...
Насчет UDP... вероятность потери пакетов все же есть, были реальные опыты которые это показывают, даже без сети (на одной машине)...
И в конце концов.. что такое TCP? это усовершеннствованый так сказать UDP, который поддерживает постоянное соединение и реализует механизм гарантированной доставки пакетов (в отличие от UDP), в UDP тебе придется это делать самому...
Абсолютно согласен. Я в пробовал сделать нечто типа чата на основе UDP. Тестировал одновременно на 3-х компьютерах. Пакеты терялись и компы видели друг друга в случайном порядке. Дальше разбираться было некогда...
реализует механизм гарантированной доставки пакетов (в отличие от UDP), в UDP тебе придется это делать самому...
чуть поправлю, если позволите. TCP реализует механизм подтверждения TCP датаграмм, а не гарантированную доставку.
по сабжу - на rsdn.ru лежала неплохая статья по написанию своего WinPopup.
повторяю - в локальной сети вероятность потери ничтожна.
Странно это конечно, но пакеты UDP теряются почти все, при отсылке сообщения мне с другого клиента, приходят мои же (которые я сам отправлял) обрезанные сообщения... короче говоря я ничего толком не понял, за ссылку на книжку спасибо!(надеюсь удастся её достать)