![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
узнать IPадрес [D6, Win95/98]
Ильдар © (2002-07-18 13:55:00)как узнать IPадрес
Anatoly Podgoretsky (2002-07-19 09:02:00) [1]Оповещение неизвестных компьютеров лучше делать широковещальном режиме, без всякого знания их адресов и состояния
Digitman (2002-07-19 08:40:00) [2]Ну вот теперь понятна задача твоя.
Что ж, вариант от <Beekeeper> вполне подойдет.
Чуть "причешу" его только :
Function GetComputerHost:String;
var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
if WSAStartup($0101, WSAData) <> 0 then;
try
GetHostName(name, $FF);
p := GetHostByName(Name);
Result:=inet_ntoa(PInAddr(p.h_addr_list^)^);
finally
WSACleanup;
end;
end;
P.S.
Ты задумывался над проблемой, могущей возникнуть в многократно повторяющейся ситуации :
1. Клиент зафиксировал свой локальный IP в таблице и подтвердил транзакцию.
2. И завис... Или физически "оторвался", не уничтожив в таблице заведенную им запись.
3. Другой клиент раз за разом в процессе собственных изменений пытается отослать извещение уже несуществующему клиенту.
?
easy (2002-07-18 19:44:00) [3]...как на Delphi - не знаю, знаю как на VB, может поможет:
Public Function ConvertAddressToString(longAddr As Long) As String
Dim myByte(3) As Byte
Dim Cnt As Long
CopyMemory myByte(0), longAddr, 4
For Cnt = 0 To 3
ConvertAddressToString = ConvertAddressToString + CStr(myByte(Cnt)) + "."
Next Cnt
ConvertAddressToString = Left$(ConvertAddressToString, Len(ConvertAddressToString) - 1)
End Function
Public Sub GetIP()
Dim Ret As Long, Tel As Long
Dim bBytes() As Byte
Dim Listing As MIB_IPADDRTABLE
Form1.Text1 = ""
On Error GoTo END1
GetIpAddrTable ByVal 0&, Ret, True
If Ret
Ильдар (2002-07-18 18:52:00) [4]>Digitman
Я хочу, чтобы при запуске каждого приложения они регистрировали IP-адрес своего компьютера в специальной таблице. А при внесении изменений оповещали все компьютеры с IP-адресами из этой базы.
Digitman (2002-07-18 18:47:00) [5]>Ильдар
Значит, сервера нет, как я понял ?
А как ты хочешь известить в этом случае иные приложения на иных компьютерах, если ни одно приложение не знает не только своего IP-адреса, но и IP-адресов тех компьютеров, которым потребуется рассылать извещения ?
Здесь есть два варианта :
- координатор в виде некоего сервера с постоянным (и известным клиентам) IP-адресом таки должен существовать;
- если нет возможности координинации средствами сервера, придется исаользовать broadcast-сообщения; либо с использованием существующих возможностей UDP-протокола либо "слепым" перебором всего диапазона IP-адресов в ЛВС
Ильдар (2002-07-18 18:38:00) [6]>Digitman
Приложение должно оповестить точно такие же приложения (копии) о некотором событии (необходимости Refresh"a)
Digitman (2002-07-18 18:31:00) [7]>Ильдар
Т.е. есть некий App-сервер, которому клиент должен при коннекте сообщить свой IP с тем, чтобы при успешной транзакции, выполненной данным клиентом, извещения обо всех изменениях в рамках этой транзакции сервер разослал другим клиентам, сопроводив их IP-адресом клиента, их выполнивших ? Так ?
Ильдар (2002-07-18 18:20:00) [8]Мне это надо для того, чтобы при изменениях в БД, сделанных на одной машине, база с этими обновлениями сразу же отображалась на машинах остальных пользователей.
Digitman (2002-07-18 18:15:00) [9]>Ильдар
У машины, на которой запущено приложение, может быть и не один IP-адрес. Тебе для каких целей нужно это ?
P.S. Winsock(2).pas в USES подключил ? Или грузишь WS2_32.DLL динамически ?
Ильдар (2002-07-18 17:40:00) [10]>Digitman машины, на которой запущено приложение
>BeeKeeper на первой же строкеWSAStartup($0101, WSAData);возникает AV
Beekeeper (2002-07-18 14:27:00) [11]Function GetComputerHost:String;
var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
Result:=inet_ntoa(PInAddr(p.h_addr_list^)^);
end;
Digitman (2002-07-18 14:00:00) [12]Чей ?