Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Сканирование лок. сети и поиск программы-сервера по ней   Найти похожие ветки 

 
Swimmer ©   (2004-02-13 20:24) [0]

Ув. Мастера, помогите. Принес я преподавателю сетевую программу. В ini-файлах прог-клиентов указываю IP сервера, все отлично работает, мне лично нравится. Но не преподу! Он требует, чтоб клиенты сами искали сервер по всей локалке, как в программах для администрирования клубов! Как сие можно реализовать? Уж очень нужно. Да, лучше всего подошло бы решение с использованием TClientSocket и TServerSocket.


 
Dimaz-z ©   (2004-02-13 20:58) [1]

ClientSocket & ServerSocket тут не подойдут...
используй UDP


 
Swimmer ©   (2004-02-13 21:23) [2]

Расскажите как...


 
имя   (2004-02-13 21:26) [3]

Удалено модератором


 
имя   (2004-02-13 21:26) [4]

Удалено модератором


 
Так мимо шел   (2004-02-14 05:02) [5]

В общих чертах:
порт клиента и сервера одинаковые (иначе никак :) ) отсюда:
1) в диалог сервера с клиентом закладываешь команду, ну допустим
GetStatusMyServer на которую сервер должен ответить StatusServer_Ready
2) в клиенте вкладываешь следующую фичу: перебираешь все станции в сети (на форуме много таких примеров, тема довольно таки избита) определяешь по имени станции ее IP-адрес и посылаешь команду  GetStatusMyServer, если на этой станции твой сервер, то он ответит StatusServer_Ready
и т.д. и т.п. :)


 
Alex Konshin ©   (2004-02-14 05:49) [6]

Ничего не надо перебирать. Клиент должен послать broadcast запрос, а сервер - просто на него ответить. Вот так клиент и узнает его адрес.


 
dr Tr0jan ©   (2004-02-17 06:21) [7]

2 Alex Konshin ©   (14.02.04 05:49) [6]:

А как отправить Broadcast запрос, используя TClientSocket?


 
Alex Konshin ©   (2004-02-17 06:42) [8]

Я с TClientSocket не работаю. Если он умеет создавать UDP сокеты, то можно, если нет, то нет.


 
Polevi ©   (2004-02-17 09:25) [9]

он не умеет


 
Alex Konshin ©   (2004-02-17 09:50) [10]

Я это подозревал. Значит, нельзя.


 
Polevi ©   (2004-02-17 10:00) [11]

поток читает UDP пакеты, пришедшие на порт 5555
код не анализирует результат вызова WSAWaitForMultipleEvents, кому надо тот доделает :)


procedure TT.Execute;
var
 Buffer:Pointer;
 Len:integer;
 evt:THandle;
 bytesRecvd:integer;
const
 bufLen=512;
begin
 GetMem(Buffer,bufLen);
 try
   try
     FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     FAddr.sin_family := AF_INET;
     FAddr.sin_addr.s_addr := INADDR_ANY;
     FAddr.sin_port := htons(5555);
     if bind(FSocket, @FAddr, SizeOf(FAddr))=SOCKET_ERROR then
       RaiseLastWin32Error;
     evt:=CreateEvent(nil,false,false,nil);
     WSAEventSelect(FSocket,evt,FD_READ);
     while not Terminated do
     begin
       WSAWaitForMultipleEvents(1,@evt,false,INFINITE,false);
       Len:=sizeof(FAddr);
       ZeroMemory(Buffer,bufLen);
       bytesRecvd:=recvfrom(FSocket,Buffer^,bufLen,0,FAddr,Len);
       if bytesRecvd=SOCKET_ERROR then
         RaiseLastWin32Error;
       //буфер содержит данные, чтото с ними делаем...
     end;
     CloseHandle(evt);
     closesocket(FSocket);
   except
   end;
 finally
   FreeMem(Buffer);
 end;
end;


отправляем в сеть броадкаст пакет по порту 5555

procedure TForm1.Button1Click(Sender: TObject);
var
 ASocket:TSocket;
 Addr: TSockAddrIn;
 Len:integer;
 BroadCast:boolean;
begin
 BroadCast:=true;
 ASocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 setsockopt (ASocket,SOL_SOCKET,SO_BROADCAST,PChar(@BroadCast),sizeof(boolean));
 Addr.sin_family := AF_INET;
 Addr.sin_addr.s_addr := INADDR_BROADCAST;
 Addr.sin_port := htons(5555);
 Len:=sizeof(Addr);
 if sendto(ASocket,PChar("hello world")^,12,0,Addr,Len)=SOCKET_ERROR then
   RaiseLastWin32Error;
 closesocket(ASocket);
end;


да и не забыть про WSAStartup


 
Verg ©   (2004-02-17 11:33) [12]


> Polevi ©   (17.02.04 10:00) [11]


> Addr.sin_addr.s_addr := INADDR_BROADCAST;


Вот это немного мутный вопрос.
Если несколько сетевых карт, то куда уйдет такой броадкаст?

BSD-системы делают что - ядро само понимает что ты хочешь отправить всем в сегменте(ах), достает таблицу интерфесов и рассылает в каждую подсеть уже нормальный броадкаст, т.е. на броадкастовые IP адреса всех подсетей (ifaddr_ipv4 | ~ifaddr_subnetmask).

А вот под виндами, тут по-моему, этот номер не пройдет. Пакет отправится на какой-то один сегмент (сетевую карту). На какой?
Я сам толком с этим не разобрался. Почему винды прописывает в маршрутную таблицу путь к INADDR_BROADCAST на какой-то один интерфейс. Главное - я не могу понять почему именно этот она выбирает, а не какой-то другой. Из каких соображений?


 
Polevi ©   (2004-02-17 11:50) [13]

>Verg ©   (17.02.04 11:33) [12]
ну будем считать что у нас один интерфейс :)
а вообще можно ручками несколько sendto



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.058 c
1-1080892540
Серж
2004-04-02 11:55
2004.04.18
Макроподстановка кода(!) в Delphi?


14-1079559965
Soft
2004-03-18 00:46
2004.04.18
Бессмертие души или околосмертный опыт?


1-1080710558
Stas
2004-03-31 09:22
2004.04.18
MDI форма в DLL


1-1080891457
EthernalWonderer
2004-04-02 11:37
2004.04.18
анимированный gif


4-1076313872
Rentgen
2004-02-09 11:04
2004.04.18
ListView_GetImageList