Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли получить IP компа, на котором запущен ServerSocket? [D5, Win95/98]


Страницы:   1 2

Ламер ©   (2004-02-16 11:11:00) 

Можно ли получить IP компа, на котором запущен ServerSocket, а остальные компы в сети не были видны?


Alex Konshin   (2004-02-16 22:08:00) [1]


nazgul   (16.02.04 13:02) [12]
2 Alex Konshin
возможно проблема в том, что вы прсто неумете видить то что написанно, помойму он ясно написал:

Я хоть и читаю свободно по-английски, и понимаю по-украински, но, извините, так и не смог понять, на каком языке пишите вы. Очевидно, что какой-то славянский, но явно не русский. Видимо в этом причина нашего непонимания. :)
Построение фразы такое, что я так и не смог разгадать смысл конца вопроса. Есть у меня подозрение, что остальные тоже в таком же затруднении.

... причём тут UDP запрос?
Я подозревал, что я это напрасно сказал - как говорится, не в коня корм. Тебе же вроде уже посоветовали книжки почитать. Как тебе можно что-то объяснить, если ты даже основ не знаешь (начиная от самого языка).


Anatoly Podgoretsky   (2004-02-16 14:30:00) [2]

Digitman ©   (16.02.04 14:06) [24]
Каждый хакер мечтает запинговать 255.255.255.255


Digitman   (2004-02-16 14:20:00) [3]


> Verg ©   (16.02.04 14:11) [26]
> Не бойся: броадкаст дальше ближайшего роутера не пойдет


я-то не боюсь) ... и прекрасно понимаю, что любой мало-мальски серьезный роутер в глоб.сети даст отлуп кул-хацкеру, вознамерившемуся  посылать с хоста в ЛВС дер.Голожоповки бродкасты в мировую сеть с призывом поиграться в бирюльки)))


Verg   (2004-02-16 14:11:00) [4]


> Digitman ©   (16.02.04 14:06) [24]


Не бойся: броадкаст дальше ближайшего роутера не пойдет :)
А если чел замусорит свой сегмент, то ему админ сети-то и вставит "нужные" мысли в "нужное место" :)


Verg   (2004-02-16 14:08:00) [5]


> Digitman ©   (16.02.04 14:02) [23]


Ну, во-первых,

> v][x ©  

Ему-то точно известно :)

Во-вторых, можно как-то, где-то, лишний раз попрактиковаться в изложении мыслей ? :))
Тем более, что я сейчас дописываю документацию по своему недавно-сданному проекту и ищу любой повод чтобы не работать (шутка:)))


Digitman   (2004-02-16 14:06:00) [6]

я рисую себе картину рушащегося мира, когда некий хренов кул-хацкер шлет ежесекундно бродкаст в мировую сеть (каждому задрипаному ее хосту !), мол, я. такой-то кул-чего-то, активизировал на своем хосте гаме-сервис))))))


Digitman   (2004-02-16 14:02:00) [7]


> Verg ©   (16.02.04 13:54) [21]


и ты, Андрей, свято веруешь, что неким кул-программерам в сей ветке (да и не только) ведомо, что есть "сегмент сети" ?!


v][x   (2004-02-16 13:59:00) [8]

2Verg

А я что против? И на UDP можно. Без проблем. И быстрее будет, и писать меньше.


Verg   (2004-02-16 13:54:00) [9]

v][x ©  

Насчет UDP.
Ладно, оставим пока в покое тезис про админов и их нелюбовь к UDP.

Имелось ввиду то, что если бы сервер наряду с основным транспортом TCP держал бы еще и свой "эхо-мояк" в виде UDP сокета слушающего известный всем заинтересованным порт.

Тогда бы для поиска этого сервера в пределах сегмента сети можно было бы отправить широковещательный UDP пакет, адресованный на этот порт. А сервер, получив бы его, отправил бы "запрашивающему" (уже юникастом) ответ - тоже UDP пакет в котором бы он назвал свои точные координаты для главного подключения по TCP/IP. В этом случае поиск сервера бы осуществлялся намного, мягко говоря, быстрее.
А главное, что недостатком негарантированности доставки UDP в данном случае можно пренебречь.


v][x   (2004-02-16 13:36:00) [10]

2Verg

Извиняюсь, кинул не тот исходник. Ну да ладно, этот тоже работает. Я его давным давно писал, поэтому и для каждого адреса. А так, конечно, за цикл его.


Verg   (2004-02-16 13:30:00) [11]


> v][x   (16.02.04 13:22) [16]


Это называется сканирование сети.
Используются неблокирующие сокеты, а не асинхронные.

А зачем для каждого адреса в отдельности WSAStartup?

Вот тут более строго об этом:

An application must call one WSACleanup call for every successful WSAStartup call to allow third-party DLLs to make use of a Ws2_32.dll on behalf of an application. This means, for example, that if an application calls WSAStartup three times, it must call WSACleanup three times. The first two calls to WSACleanup do nothing except decrement an internal counter; the final WSACleanup call for the task does all necessary resource deallocation for the task.


v][x   (2004-02-16 13:29:00) [12]

2nazgul
... причём тут UDP запрос?
Нужно читать умные книжки и обточить руки напильником, тогда поймешь причем тут UDP. Кстати, тоже довольно хороший вариант, только в Inet'е он также бесполезен как и мой вариант. UDP пакеты глушатся чем только можно, протокол не поддерживает гарантированную доставку (т.е. даже не узнаешь, что пакет не дошел), но работае еще быстрее чем асинхронный сокет. Правда, админы часто настраивают сеть так, чтобы UDP пакеты глушились.


v][x   (2004-02-16 13:26:00) [13]

Да, кстати, метод возвращает true, если сервер ответил или false, если он не был найден или возникла ошибка.


v][x   (2004-02-16 13:22:00) [14]

Возможно также использова асинхронные сокеты:

function TMainForm.FindServer:Boolean;
const StartAddr=1;
const FinishAddr=254;
var
 Data:WSAData;
 Sock:Array[StartAddr..FinishAddr] of TSocket;
 Addr:TSockAddr;
 Fd:TFdSet;
 k,i,p:Integer;
 TmVal:TTimeVal;
begin
 FD_ZERO(Fd);
 try
   For i:=StartAddr to FinishAddr do
   begin
     if WSAStartup($101,Data)<>0 then
     begin
       Result:=False;
       Exit;
     end;
     Addr.sin_family:=AF_INET;
     Addr.sin_addr.S_addr:=inet_addr(PChar('192.168.100.'+IntToStr(i)));
     Sock[i]:=Socket(AF_INET,SOCK_STREAM,0);
     if Sock[i]=INVALID_SOCKET then
       Result:=False;
     Addr.sin_port:=htons(1600);
     k:=1;
     FD_SET(Sock[i],Fd);
     ioctlsocket(Integer(Sock[i]),FIONBIO,k);
     connect(Sock[i],Addr,SizeOf(Addr))
   end;
   TmVal.tv_sec:=3;
   TmVal.tv_usec:=0;
   Select(FD_SETSIZE,nil,@Fd,nil,@TmVal);
   For i:=StartAddr to FinishAddr do
     if FD_ISSET(Sock[i],Fd) then
     begin
       p:=SizeOf(k);
       IpServer:='192.168.100.'+IntToStr(i);
       CloseSocket(Sock[i]);
       Result:=True;
       Exit;
     end;
 finally
   WSACleanup;
 end;
end;


Метод создает асинхронные сокеты и пытается коннектится на порт 1600 ко всем компам в локальной сети, IP которых начинаются на 192.168.100. Метод работает 100%, время поиска в сети из 67 компов ~2 c.


Digitman   (2004-02-16 13:14:00) [15]

что тебе подсказать, если ты даже не удосужился уточнить, в рамках ЛВС все это у тебя будет работать или в глоб.сети ?


Ламер   (2004-02-16 13:06:00) [16]

НУ хоть что-нибудь.


Ламер   (2004-02-16 13:03:00) [17]

Обратили внимание на мой ник и подскажите: чтобы клиент посылал широковещательный UDP запрос, а сервер, слушал такие запросы и отвечал на них.


nazgul   (2004-02-16 13:02:00) [18]

2 Alex Konshin
возможно проблема в том, что вы прсто неумете видить то что написанно, помойму он ясно написал:

Ламер   (16.02.04 11:11)  
Можно ли получить IP компа, на котором запущен ServerSocket, а остальные компы в сети не были видны?

... причём тут UDP запрос?


Anatoly Podgoretsky   (2004-02-16 12:39:00) [19]

Иногда лучше жевать, чем говорить.


Alex Konshin   (2004-02-16 12:38:00) [20]

Черномырдин отдыхает.
Вы с nazgul нашли друг друга. :)

Вы меня недопонимаете
Да, есть такое.
Попробуй написать вопрос подробно и по-русски. Многим это помогает.
Прежде чем требовать уважения к своим вопросам, постарайся уважать тех, кто будет их читать и отвечать на них.
И прежде чем начать задавать вопросы, очень полезно перед этим почитать форум. Это обычно избавляет от необходимости задавать свой вопрос.

Тебе нужно, чтобы клиент посылал широковещательный UDP запрос, а сервер, слушал такие запросы и отвечал на них.

Этот вопрос задается тут чуть ли не несколько раз в неделю.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо