Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2011, 00:19   #1
32-bit
 
Регистрация: 26.12.2009
Сообщений: 4
По умолчанию поиск IP сервера по номеру порта

Есть клиент и сервер. Они работают на 8080 и 8081 порту. запускаем сервер. запускаем клиент прописываем в поле Edit IP-адрес сервера и жмем кнопку подлючится и всё суперски работает. но нужно сделать чтобы приложение клиент само находило ip адрес среди компьютеров в сети.
Где то говорили что в Delphi можно опросить сеть стандартными модулями чтобы получить список адресов, в которых искать порты.
Можно прописать оригинальные номера портов чтобы достаточно однозначно определять компьютер в сети с запущеным приложением Сервер
32-bit вне форума Ответить с цитированием
Старый 19.12.2011, 06:41   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Способ применим только в подсети локальной сети:
1. Сервер запускает UDP сервер
2. Клиент посылает бродкаст по заранее определенному порту. бродкаст рассылается всем в локальной сети
3. сервер отвечает на полученный бродкаст
4. клиент теперь знает где сервер
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 19.12.2011, 08:33   #3
32-bit
 
Регистрация: 26.12.2009
Сообщений: 4
По умолчанию

А такой пример можно найти гденибудь?
32-bit вне форума Ответить с цитированием
Старый 19.12.2011, 14:07   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

на сервере TIdUDPServer
Код:
procedure TForm1.Button1Click(Sender: TObject);
Const LocatorStr='Where are you?';
var
  Init: TWSAData;
  timeout:timeval;
  SockOpt: BOOL;
  Sock: TSocket;
  Target: TSockAddrIn;
  Responce:string;
  Dummy,i,r:integer;
begin
  WSAStartup($101,Init);
  Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
  SockOpt:=TRUE;
  SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt));
  timeout.tv_sec:=5000;
  timeout.tv_usec:=0;
  SetSockOpt(Sock,SOL_SOCKET,SO_RCVTIMEO, PChar(@timeout),SizeOf(timeout));
  Target.sin_port:=htons(8167);
  Target.sin_addr.S_addr:=INADDR_BROADCAST;
  Target.sa_family:=AF_INET;
  SendTo(Sock,PChar(LocatorStr)^,Length(LocatorStr),0,Target,SizeOf(Target));
  SetLength(Responce,1024);
  Dummy:=SizeOf(Target);
  r:=RecvFrom(Sock,PChar(Responce)^,Length(Responce),0,Target,Dummy);
  SetLength(Responce,r);
  if r>0 then MessageBox(0,PChar(Responce), inet_ntoa(Target.sin_addr),ID_OK);
  CloseSocket(Sock);
  WSACleanup;
end;
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TIdBytes; ABinding: TIdSocketHandle);
const s='I am here';
var a:TIdBytes;
begin
  SetLength(a,length(s));
  move(s[1],a[0],Length(s));
  ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,a);
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 19.12.2011 в 14:16.
Slym вне форума Ответить с цитированием
Старый 20.12.2011, 12:06   #5
32-bit
 
Регистрация: 26.12.2009
Сообщений: 4
По умолчанию

а если отправлять сообщение при помощи idudpclient.broadcast('NOIZE';порт) ;
подскажите что написать в приложении сервере чтобы принять это сообщение, ответить и на машине с который был отправлен бродкаст определить ip адрес ответчика

если можно в асе 433726776, моё мыло vager13@rambler.ru

у меня всего несколько вопросов, я уверен не много времени отниму у вас Slim

Последний раз редактировалось 32-bit; 20.12.2011 в 12:15.
32-bit вне форума Ответить с цитированием
Старый 20.12.2011, 14:29   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

procedure TForm1.Button2Click(Sender: TObject);
var
UDPClient:TIdUDPClient;
a:TIdBytes;
PeerIP:string;
PeerPort:word;
begin
UDPClient:=TIdUDPClient.Create;
try
UDPClient.Broadcast('Where are you?',8167);
SetLength(a,1024);
UDPClient.ReceiveBuffer(a,PeerIP,Pe erPort,5000);
finally
UDPClient.Free;
end;
MessageBox(0,PChar(PeerIP+':'+IntTo Str(PeerPort)), 'Я тут',ID_OK);
end;

на сервере
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
const s='I am here';
var a:TIdBytes;
begin
SetLength(a,length(s));
move(s[1],a[0],Length(s));
ABinding.SendTo(ABinding.PeerIP,ABi nding.PeerPort,a);
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 20.12.2011 в 14:31.
Slym вне форума Ответить с цитированием
Старый 20.12.2011, 20:44   #7
32-bit
 
Регистрация: 26.12.2009
Сообщений: 4
По умолчанию

большое спасибо
но делфа 7 ругается на это procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);

IdSocketHandle я добавил в uses
32-bit вне форума Ответить с цитированием
Старый 20.12.2011, 21:50   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

версия инди какая? из коробки? ставь свежую
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск человека по номеру телефона hunter03 БД в Delphi 4 31.03.2011 17:24
Поиск абонента по на карте номеру телефона. sexybabeonwings Общие вопросы Delphi 1 26.09.2009 16:39