tServerSocket.OnClientConnect-кога е от localhost?

12 отговора 240 прегледа
#1

tServerSocket.OnClientConnect-кога е от localhost?

tServerSocket.OnClientConnect - кога конектът е от клиент на localhost?
Изглежда елемнтарно и много лесно мога да проверя
tServerSocket.OnClientConnect(Sender: TObject; aSocket: TCustomWinSocket);
if aSocket.LocalAddress='127.0.0.1'
и сигурно в над 90% от случеите ще работи, но може би има и маса частни случеи.
Мога да проверявам и дали LocalAddress и RemoteAddress са равни.
Потърсхи в гугъла - не намерих нещо интересно.
Та ако споделите опит и знания - ще е много полезно за мен
Въобще, откакто се наложи половин ден да налучкваме едни чертички пред името на com порта съм станал много параноичен :)

Редактирано от NikB на

Отговор
в отговор на NikB #2

Re: tServerSocket.OnClientConnect-кога е от localhost?

Не знам решение, но мога да дам някои идеи.
Като напишеш route print в предпоследната колона Interface може да видиш различните IP адреси (повтарят се), които са локални.
За всяка мрежова карта, модем и др. под. трябва да има различен адрес в различна подмрежа (подмрежата не е от значение в случая) за да работи TCP/IP.

Не знам, ако твоя адрес е напр. 192.168.1.100 и се свържеш от него, дали aSocket.LocalAddress='127.0.0.1' ? Или RemoteAddress трябва да се гледа?
Ако не -- трябва да намериш някой компонент, който ти дава всички локални мрежови интерфейси и да проверяваш дали е някой от тях. Между другото в по-новите Windows-и вадене на мрежовия кабел IP адреса изчезва, а при пъхане се появява, същото е и за dial-up. Също адреса може да се променя. Тъй че всеки път трябва да се проверява кои са локалните мрежови интерфейси.

LocalAddress и RemoteAddress да са равни не е критерий.

Отговор
в отговор на Йopдaн #3

Route print с изключване на кабела :)

Да, прав си - така изглежда Route при изключване на кабела на мрежата (WinXP)

Благодаря за мнението :), въпросът остава открит.


Редактирано от NikB на

Отговор
в отговор на NikB #4

Re: tServerSocket.OnClientConnect-кога е от localhost?

Отвори един command prompt, напиши ping localhost и ще видиш на кое IP ти отговаря localhost-а.
Процеса се нарича reverse lookup, ако се не лъжа. Компонент със сорс, който върши работата (или поне така твърди, аз не съм го пробвал) има на [линк]
Тамън ще провериш дали нещата бачкат.

чети и дишай по-леко
Отговор
в отговор на NikB #5

Re: Route print с изключване на кабела :)

Пак да питам с твойте IP-та:
Когато в клиента се конектваш към:
1) 192.168.1.11
2) 212.56.24.49

Тогава при OnConnect какъв ти е RemoteAddress в твоя сървър?

Отговор
в отговор на NikB #6

Re: tServerSocket.OnClientConnect-кога е от localhost?

Трябва ти GetAdaptersInfo от
[линк]

Help:
[линк]

Отговор
в отговор на Pechenia #7

Направих го, май не ми е ясно :)

Направих го, май не ми е ясно :)
Съзадох си рънтайм един TSocketHostLookup (не съм го инсталирал)
Конектвам се към 127.0.0.1, 192.168.1.11 и на 212.56.24.49 - винаги ми връща че броят на адресите е AddressCount=1 (може би това е броя на MAC адресите на моята машина) и че AddressStr[0] е съответния адрес.
От фаервола виждам активност по порта за DNS
Мога да ти изпратя готовия демо проект на Д5.

Отговор
в отговор на Йopдaн #8

Винаги и двата адреса (RemoteAddress и LovcalAddre

Винаги и двата адреса (RemoteAddress и LovcalAddress) са еднакви и са този, на който отварям порта (и на клиента и на сървъра).

Отговор
в отговор на Йopдaн #9

Не успях да изтегля jedi.org...IPHlpAPI

Не успях да изтегля jedi.org...IPHlpAPI.zip, но утре ще разгледам [линк]


Тая функцийка ми връща спистък с ползваните от локалхоста IP адреси.
Не ми е ясно защо в списъка липсва 127.0.0.1 и дали тоя 127.0.0.1 може да бъде сменен с нещо друго.

{}function Get_IP_Strings: TStrings;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
WSAData : TWSAData;
phe : PHostEnt;
pptr : PaPInAddr;
Name : array [0..$FF] of Char;
J : Integer;
err : integer;
begin
Result := nil;
try
err:=WSAStartup($0101, WSAData);
if (err=0) then begin
try
GetHostName(Name, SizeOf(Name));
phe := GetHostByName(Name);
if phe<>nil then begin
pPtr := PaPInAddr(phe^.h_addr_list);
J := 0;
Result := tStringList.Create;
while pPtr^[J] <> nil do begin
Result.Add(inet_ntoa(pptr^[J]^));
Inc(J);
end;
end;
finally
WSACleanup;
end;
end;
except
end;
end;


Отговор
в отговор на NikB #10

Re: Направих го, май не ми е ясно :)

Чакай сега че и аз се обърках
Значи аз мисля че на теб ти трябва следното нещо (ако греша ме поправяй):
1) на localhost отговаря едно IP. Това IP можеш да го видиш и като от command promt напишеш:
ping localhost
Това трябва да ти върне нещо от сорта (за моя комп например):
Pinging pc_emo [127.0.0.1] with 32 bytes of data:
...
Демек 127.0.0.1 е IP-то на localhost
2) когато твоята програма получи заявка ти получаваш от кое IP е заявката
3) твоята програма иска да знае дали IP-то от което е заявката е IP-то на localhost
Какво следва да направиш:
1) При старт на програмата да вземеш IP-то на localhost чрез компонента дето ти пратих, демек да му подадеш като параметър localhost и да получиш например 127.0.0.1
2) При заявка от клиента да сравниш IP-то от което идва заявката с IP-то от 1)

чети и дишай по-леко
Отговор
в отговор на NikB #11

jedi.org...IPHlpAPI

Щото е ftp: a не [линк]:

името localhost винаги е 127.0.0.1

Отговор
в отговор на Pechenia #12

Това трябва да е :)

Просто предлагаш да се вземе адреса на хост с име "localhost".
Благодаря, това трябва да е :)

Отговор
в отговор на Йopдaн #13

Re: jedi.org...IPHlpAPI

Ти как разбра, че FlashGet-та ми го е търсил на http?


Отговор