Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
3-1079773115
Санек
2004-03-20 11:58
2004.04.18
Как создать редактируемое поле на клиенте, которого нет в таблице


1-1080827413
xloki
2004-04-01 17:50
2004.04.18
Mouse_event


1-1080128088
Rawman
2004-03-24 14:34
2004.04.18
DBGridEh, кто работал с ним подскажите (EhLib)


7-1077171519
atmospheric
2004-02-19 09:18
2004.04.18
Как зарегистровать свое расширение ?


9-1066561798
Landgraph
2003-10-19 15:09
2004.04.18
Как это они так делают... =)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский