Чат для локальной сети
Нужно написать курсовой - чат по локальной сети на Делфи7. Желательно через TCP/IP. Посоветуйте что-нибудь типа "TCP/IP для чайников";)
По поводу чайников - не знаю, но вообще, книжка хорошая: http://www.zeiss.net.ru/docs/technol/tcpip/tcp00.htm
Может за тебя написать? За n-ную сумму разумеется :)
Нужно написать курсовой - чат по локальной сети на Делфи7. Желательно через TCP/IP. Посоветуйте что-нибудь типа "TCP/IP для чайников";)
Попробуй использовать сокеты (с ними никакого TCP/IP ты и не узнаешь). Можно посложнее tcp-сервер и tcp-клиент.
Я давно под Windows не программировал -- поэтому сейчас рекомендую сокеты -- удобнее ничего нет ;-)
По поводу чайников - не знаю, но вообще, книжка хорошая: http://www.zeiss.net.ru/docs/technol/tcpip/tcp00.htm
Может за тебя написать? За n-ную сумму разумеется :)
За книжку спасибо.
Хотелось бы справиться самому, я еще никогда не работал с сетями.
Я, кажется, нашел, через что лучше всего делать чат в Делфи7 (Internet - TcpServer & TcpClient)
Во всяком случае, в демке использованы именно они.
Теперь другая проблема - как найти работающий сервер?
Предполагается, что экзэмпляр проги сможет работать и как клиент, и как сервер, и при этом может быть сразу несколько серверов, в каждом из которых идет отдельная беседа. Беда в том, что при запуске мне не известно о сервере ничего, кроме номера открытого порта (номер порта я установлю сам :)).
Или мне лучше сменить архитектуру, и вести все беседы на одном сервере? Крайне не хотелось бы вводить отдельный экзэмпляр проги под сервер, чтобы остальные были клиентами.
Подскажите, что выбрать, плиз:???:
Теперь другая проблема - как найти работающий сервер?
Предполагается, что экзэмпляр проги сможет работать и как клиент, и как сервер, и при этом может быть сразу несколько серверов, в каждом из которых идет отдельная беседа.
Вах! Ты не знаешь просто, как работает обычный чат. А чат работает очень просто, и TCP тебе тут не надо совершенно. Тут надо UDP. Отправлять широковещательные пакеты на всю подсеть. Каждый экземпляр проги, это тебе и сервер, и клиент. Алгоритм получения адреса, на который надо слать пакеты, что бы их получала вся подсеть прост:
1. Определяем текущий IP и маску твоей подсети.
2. По полученным данным определяем широковещательный адрес для данной подсети. Сделать это можно так:
//ИНВЕРТИРУЯ МАСКУ
subnet_boradcast = subnet_ip | max_addr;//ВЫЧИСЛЯЕМ ШИРОКОВЕЩАТЕЛЬНЫЙ
//АДРЕС ПРИ ПОМОЩИ ЛОГИЧЕСКОГО "ИЛИ"
Отправляем пакеты на него. Будет получать вся подсеть. Т.е. например, если у тебя адрес в сети 192.168.1.15 при маске 24 бита (т.е. 255.255.255.0), то широковещательный адрес получится 192.168.1.255 и всё, что будет отправлено на него будет получено всеми хостами подсети 192.168.1.0 т.е. 192.168.1.1 - 192.168.1.254
Для лучшего усвоения книжки, и вообще понимания работы сети советую скачать windump - аналог *nix-ового tcpdump'а. Правда глюковат слегка ;). Ну и nmap тоже не помешает. Обе эти проги для полноценной работы в windows требуют комплект библиотек winpcap, ссылка на который там присутствует.
Вах! Ты не знаешь просто, как работает обычный чат.
Знал бы, не спрашивал бы.;)
1. Определяем текущий IP и маску твоей подсети.
Это как? В смысле, можно стандартными средствами Делфи, или нужно что-то еще?
subnet_boradcast = subnet_ip | max_addr;//ВЫЧИСЛЯЕМ ШИРОКОВЕЩАТЕЛЬНЫЙ
//АДРЕС ПРИ ПОМОЩИ ЛОГИЧЕСКОГО "ИЛИ"
Если можно, приводи примеры на Паскале, я только начал учить Си. Если я верно понял код, то он делает вот что:
subnet_broadcast:=subnet_ip or max_addr;
Знал бы, не спрашивал бы.;)
Ну... Я не думал, что все так запущено :)
Это как? В смысле, можно стандартными средствами Делфи, или нужно что-то еще?
Мммм... Честно говоря, на Делфях вообще мало что делал. На Win API - легко. А в Делфи кажись нет таких средств. Так же как и в Билдере.
Смотри на http://msdn.microsoft.com функцию GetAdaptersInfo(...). Она тебе поможет разрешить проблемы с адресом и маской. Правда там написано в расчете на Си, но на Паскаль переделать не проблема, если знаешь Паскаль.
Если можно, приводи примеры на Паскале, я только начал учить Си.
Низя :) Лень напрягаться. Паскаль - давно уже был.
Если я верно понял код, то он делает вот что:
subnet_broadcast:=subnet_ip or max_addr;
Верно понял. Но главное - что бы ты понял идею, а не этот кусочек кода. А тут нужно чуток теории знать что бы понять. Но думаю тебе еще хватит времени.
На Win API - легко.
WinAPI так WinAPI, но я еще пороюсь в Делфях, вдруг чего узнаю.
Времени куча, да и выбор темы еще не оформлен. Если совсем зайду в тупик, выберу что-нибудь другое, хотя будет чертовски жаль.:(
Времени куча, да и выбор темы еще не оформлен. Если совсем зайду в тупик, выберу что-нибудь другое, хотя будет чертовски жаль.:(
Да ладно тебе. Тут делов то на день.
Если возьмешься, то разрулишь до сдачи. Она ведь летом, в июне?
Да ладно тебе. Тут делов то на день.
Если возьмешься, то разрулишь до сдачи. Она ведь летом, в июне?
На день? Хехе:) Нет, мне тут надо врубаться и врубаться, а ведь есть еще и др. дисциплины. Преподы ходят вокруг стаей голодных волков.
Когда сдача, еще не узнал.
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
Этот компонент мне не очень нравится, слишком тесный, заточен под пересылку строк.
Главная проблема - как узнать, что к тебе пришли какие-то данные :???: Периодически пытаться что-нибудь считать? Блин, и почему разработчики не сделали события OnDataReceived?:x
На день? Хехе:) Нет, мне тут надо врубаться и врубаться, а ведь есть еще и др. дисциплины. Преподы ходят вокруг стаей голодных волков.
Когда сдача, еще не узнал.
Кстати, тебе обязательно на Делфях?
Вот, кстати, нашел в Делфе такую вещь:
компонент IdUDPServer метод Broadcast - посылает данные на всю сеть. Вроде как он шлет данные как обычно, но на адрес 255.255.255.255 Сработает ли такой финт?
Попробуй, должен сработать - чаты в основном так и работают. Но все равно это будет действовать только в пределах одной подсети, а не всей сети в целом, т.к. подобные пакеты убиваются маршрутизаторами, когда попадают на них. А между подсетями стоят маршрутизаторы. Если слать направленные broadcast-пакеты, например 192.168.0.255 (при маске подсети 24 бита), то такие пакеты будут переправлены из одной подстети в другую. Т.е. можно расширить область действия твоего чата хоть в инет :)
Этот компонент мне не очень нравится, слишком тесный, заточен под пересылку строк.
Главная проблема - как узнать, что к тебе пришли какие-то данные :???: Периодически пытаться что-нибудь считать? Блин, и почему разработчики не сделали события OnDataReceived?:x
Ну и напиши на WIN API. Только придется постоянно слушать UDP-сокет в потоке. Но это нормально. За то ни каких проблем не возникнет с периодическим опросом сокета.
хм... я конечно не хочу вмешиваться в ликбез, но будь я администратором сети, в которой будет работать чат - оторвал бы руки. нафига повышать броадкасты в сети? когда проще - сделать ОДИН выделенный сервер и коннектится к нему. тогда не будет проблем с маршрутизаторами, VLAN и т. п.
Согласен полностью. Но см. начало. Это тема курсовика. Помоему вполне нормальная тема. Есть неплохой повод более-менее в теории разобраться. А если разберешься, то уж точно поймешь, что так делать не требуется. Да и смотря какие сети еще. Если нормальная сетка, то да. А если это просто любительская сетка в которой 10-20 компов? В ней может и не быть желающих ставить нормальный выделенный сервер. В общем - пусть человек делает так, как ему сейчас хочется.
Согласен полностью. Но см. начало. Это тема курсовика. Помоему вполне нормальная тема. Есть неплохой повод более-менее в теории разобраться. А если разберешься, то уж точно поймешь, что так делать не требуется. Да и смотря какие сети еще. Если нормальная сетка, то да. А если это просто любительская сетка в которой 10-20 компов? В ней может и не быть желающих ставить нормальный выделенный сервер. В общем - пусть человек делает так, как ему сейчас хочется.
ну ты знаешь мое отношение к написанию программ по принципу "как хочется". да написать полноценный клиент серверный чат - лучший способ познать теорию чем писать очередной недоделанный net send...
Кстати, тебе обязательно на Делфях?
Да.
Т.е. можно расширить область действия твоего чата хоть в инет :)
Нет уж, спасибо.:)
Ну и напиши на WIN API. Только придется постоянно слушать UDP-сокет в потоке. Но это нормально. За то ни каких проблем не возникнет с периодическим опросом сокета.
Видишь ли, я вообще не знаю WinAPI! Точнее, теоретически знаю, но не хочется с ними иметь дело без крайней (КРАЙНЕЙ!) нужды.
смотря какие сети
Чат должен "работать" в сети аудитории, можно даже без выхода на общеинститускую.
сети, в которой будет работать чат
А кто сказал, что он будет работать?:) Курсовой, похоже, придется писать по принципу "сделал - показал - сдал - стер и забыл как кошмарный сон".
Все равно препод - ТУПОЙ, и не поймет, оптимален код чата или нет.
ну ты знаешь мое отношение к написанию программ по принципу "как хочется". да написать полноценный клиент серверный чат - лучший способ познать теорию чем писать очередной недоделанный net send...
Тут позволю не совсем согласится. Просто все говорят, что де, вот так вот хорошо, а вот так - плохо. Мне кажется, что если это не фатально (как с наркотиками например) и есть возможность, то человеку лучше всего самому проверить оба варианта. Что бы железно усвоить - почему хорошо, и почему плохо.
И все же в некоторых условиях для постоянной передачи информации нужен именно UDP, или ты не согласен? :)
orel - ну а то, что только на Делфи, видимо обусловлено последней строчкой твоего поста. Если уж препод Делфи осилить не может, то действительно, что с него взять...
Видишь ли, я вообще не знаю WinAPI! Точнее, теоретически знаю, но не хочется с ними иметь дело без крайней (КРАЙНЕЙ!) нужды.
Ну я вообще не знаю VCL-компоненты для работы с сетью. Все делаю на API. Так что, если буш делать на них, то я тебе точно не помощник. Т.к. за просто так мне не хочется изучать совершенно не нужный материал.
Тут позволю не совсем согласится. Просто все говорят, что де, вот так вот хорошо, а вот так - плохо. Мне кажется, что если это не фатально (как с наркотиками например) и есть возможность, то человеку лучше всего самому проверить оба варианта. Что бы железно усвоить - почему хорошо, и почему плохо.
если оба - отлично. только вот не факт, что попробовав оба, человек выберет нужный. он выберет тот, что покажется более легким. а иногда вообще не станет пробовать оба.
И все же в некоторых условиях для постоянной передачи информации нужен именно UDP, или ты не согласен? :)
UDP хорошь в очень немногих случаях. например когда не нужна гарантия доставки пакета или когда
эта гарантия мешает. в локальной сети TCP работает даже побыстрее. но впринципе - все равно . чем хочет, тем пусть и пользуется. в Микрософтовской локалке вообще без TCP/IP можно обойтись :)
если оба - отлично. только вот не факт, что попробовав оба, человек выберет нужный. он выберет тот, что покажется более легким. а иногда вообще не станет пробовать оба.
Ну... Тогда тут учить чему-то бесполезно. Такой человек будет делать только по шаблонам.
UDP хорошь в очень немногих случаях.
Ммм... Хотя бы DHCP и SNMP- хочешь сказать, что это очень немного? А передача поткового трафика? Помоему совсем не мало уже.
мне не хочется изучать совершенно не нужный материал
А я тебя и не заставляю.;)
Можно договорится так - ты подсказываешь ЧТО конкретно делать, я ищу соотв. возможности в Делфи.
Кстати, вопрос с определением своего IP снят.
[RIGHT]Mandrake_blog[/RIGHT]
Еще один рекламщик-гробокопатель...