![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Calypso |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
Я сделал сетевую прогу-сервер и прогу-клиент с помощью компонентов ServerSocket и ClientSocket, но вот беда: призапуске клиента необходимо вручную вводить ИП-адрес хоста где запущен сервер. Как сделать чтобы клиент сам сканировал сеть и определял наличие сервера. Я тупо делаю так:
Но этот процесс растягивается на 10 минут. Помогите, кто разбирается никто реально ничего не подсказывает....буду благодарен Это сообщение отредактировал(а) p0s0l - 28.9.2005, 15:30 |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Попробуй послать широковешательный пакет с запросом.
А на сервере обработай и ответь клиенту. -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
напрашивается ворос: как послать широковещательный пакет с запросом?
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Посылаешь пакет на адрес xxx.xxx.xxx.255. Если сетка класса "C".
Например, в твоей сети адреса машин начинаются с 192.168.222.ххх вот и отправляешь на 192.168.222.255. Поэкспериментируй с netsend-ом. Если есть такие службы на компах в сети, то они все получат твое сообщение. |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Обшибся малость Это сообщение отредактировал(а) Girder - 30.6.2004, 15:10 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Гость_Unregistered |
|
|||
|
Unregistered |
Как так обшибся? Все должно работать. Попробуй.
|
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Да это я не тебе,а dsergey. Просто когда я писал ответ(отвлекли на работе малость
Как ты написал тоже можно. Это сообщение отредактировал(а) Girder - 30.6.2004, 16:50 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
мне здаётся, что это нормально. Сканеры так и работают. |
|||
|
||||
| Гость_Unregistered |
|
|||
|
Unregistered |
dsergey, не надо путать попу с пальцем
|
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
|
||||
|
|||||
| Calypso |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
У меня так не получается. Как я понял сделать надо так:
И ни к чему он не подключается, а следовательно нельзя послать пакет..... Конечно я чего-то недопонимаю. Возникла мысль: А что если подконнект осуществлять не по одному адресу, а сразу по нескольким с помощью нескольких компонентов. Но вот задача: на строке TcpClient.Open; или ClientSocket.Open или UdpSocket.Open; процесс останавливается и весь параллелизм сводится к нулю. Я чтото слыхал про параллельное программирование, может это и есть выход, но как запустить несколько взаимодействующих процессов из проги.................... Это сообщение отредактировал(а) Calypso - 2.7.2004, 09:33 |
||||||
|
|||||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
File->New->Application
Бросаеш на форму три кнопки и memo Имена кнопок bSendTo,bStartUDPServer,bStopUDPServer и подцепляеш к ним(OnClick) обработчики Заменяеш модуль на следующий:
Может быть есть ошибки - я думаю сам разберешся. Удачи. Это сообщение отредактировал(а) Girder - 2.7.2004, 15:46 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Лови исходник многопоточного сканера портов.
Это сообщение отредактировал(а) RAdmin - 23.7.2005, 19:49 Присоединённый файл ( Кол-во скачиваний: 160 )
prtscn.rar 4,71 Kb |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Забыл расписать(а то мож чё непонятно).
Кнопки: bSendTo - Посылка широковещательного UDP пакета bStartUDPServer,bStopUDPServer - соответственно запуск и старт UDP эхо сервера. Компилируеш и запускаеш на двух компьютерах. На одном запускаеш сервер, на другом посылаеш широковешательный UDP пакет.
Удачи. -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Calypso |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
|
|||
|
||||
| Calypso |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
Заценил исходники и от Girder и от
RAdmin. Благодарю, именно это я и ищу уже недели две-три
Задачи, которые решают эти проги, я бы сказал, прямо перпендикулярные. УGirder на один порт сканируется вся сеть, а у RAdmin на один ИП сканируются все порты. Толико я не понял почему я отправляю пакет на порт 1212 а "приходит" он на сервер в виде совершенно иного, причем при каждом обмене номер порта на сервере увеличивается. Впрочем полезность от этого не уменьшается.... Это сообщение отредактировал(а) Calypso - 5.7.2004, 07:07 |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Вот здесь очень хорошо все расписанно(мне к этому добавить не чего):
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021 Но если лень читать, то вот выдрал тебе ответ(если я твой вопрос правильно понял
А вообще почитай, статья свежая и доходчивая. Удачи. -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Calypso |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
Girder
Тхенкс Ю Это сообщение отредактировал(а) Calypso - 6.7.2004, 04:38 |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 1 Всего: 55 |
Сразу извиняюсь за OFFTOP.
Тут заглянул в эту тему, посмотрел приведенный Girder пример. Пу сути правильный, но, по реализации есть серьезное замечание:
Такая реализация потока абсолютно бессмысленна! Метод GetAdd в этом случае будет исполняться в контексте основного потока приложения. Т.е. результат будет таким-же как и вызов данного метода непосредственно из обработчика какой-нибудь кнопки. Убедиться в этом очень просто, достаточно запустить приведенный пример, и нажать кнопку bStartUDPServer. После этого, программа перестанет реагировать на Ваши нажатия, перемещения формы и пр. Реагировать она будет лишь на получение пакета. Это следствие того, что основной поток, вместо того что-бы обрабатывать поток сообщений от Windows, будет приостановлен в ожидании получения пакета (RecvFrom в GetAdd). Дело в том, что метод Synchronize специально сделан для того, что-бы приостановить текущий поток и запустить переданный ему метод в контексте основного потока. Это нужно для обеспечения нормальной работы обращений к VCL-компонентам. Я бы не стал сюда писать, но дело в том, что подобный стиль написания "многопоточных" приложений я уже встречал, причем в статье то-ли на "Мастерах Дельфи", то-ли в "Королевстве Делфи". К счастью, сейчас найти эту статью мнее не удалось, надеюсь ее сняли с сайта. В той статье, автор пропагандировал именно такой способ написания многопоточных приложений! Он искренне считал что таким образом, выполняя основное действие через Syncronize, он получает именно многопоточное приложение. Так что мне кажется, что Girder стал жертвой этой вредоносной статьи. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
По моему ты ошибся, я подправил это в тот же день как записал. Я даже оставил в годе: "// обшибся: было Synchronize(GetAdd);". И дату посмотри когда я внес и отредактировал: внес:"Дата 2.7.2004, 13:51" отредактировал: "Это сообщение отредактировал Girder - 2.7.2004, 15:46" А эти статьи я не читал. Просто паралельно был загружен код где требуется синхронизация. Просто лень весь код набивать. Набросал на пустую форму заготовки из других и отредактировал, а это просмотрел
Мой кладезь знаний: MSDN и Help Delphi Удачи. Это сообщение отредактировал(а) Girder - 12.7.2004, 09:38 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Петрович |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 1 Всего: 55 |
Приношу свои извинения. У меня страница была сохранена на локальном диске в первоначальной редакции. Поэтому предыдущий пост относился именно к ней. Что касается текущей редакции (от 2.7.2004, 15:46) то она к сожалению тоже не без греха. Дело в том, что обращение к методам и свойствам VCL в контексте не основного потока небезопасно. Т.е., как раз вот такие операторы:
допустимо использовать лишь методах запускаемых через Synchronize. Самое неприятное, что это вызывает ошибки довольно редко. Но проявляться они могут настолько странным образом, что могут кого угодно запутать. В качестве примера, такое в принципе приемлемо - в данном случае, вряд-ли кто будет во время вывода в Memo что-то туда "вколачивать". Но, для "боевой" программы это недопустимо. Это сообщение отредактировал(а) Петрович - 13.7.2004, 08:39 -------------------- Все знать невозможно, но хочется |
||||
|
|||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
Согласен. Только вывод в Memo cделан для наглядности работы проги(а не для того чтобы тупа передерать
Ладно, думаю мы друг друга поняли. Удачи. Это сообщение отредактировал(а) Girder - 13.7.2004, 09:15 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Calypso |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 30.6.2004 Репутация: нет Всего: нет |
Мой админ мне по шапке не даст
Благодарствую! |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |