Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Внизузнать IPадрес Найти похожие ветки
← →
Ильдар (2002-07-18 13:55) [0]как узнать IPадрес
← →
Digitman (2002-07-18 14:00) [1]Чей ?
← →
Beekeeper (2002-07-18 14:27) [2]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;
← →
Ильдар (2002-07-18 17:40) [3]>Digitman машины, на которой запущено приложение
>BeeKeeper на первой же строкеWSAStartup($0101, WSAData);
возникает AV
← →
Digitman (2002-07-18 18:15) [4]>Ильдар
У машины, на которой запущено приложение, может быть и не один IP-адрес. Тебе для каких целей нужно это ?
P.S. Winsock(2).pas в USES подключил ? Или грузишь WS2_32.DLL динамически ?
← →
Ильдар (2002-07-18 18:20) [5]Мне это надо для того, чтобы при изменениях в БД, сделанных на одной машине, база с этими обновлениями сразу же отображалась на машинах остальных пользователей.
← →
Digitman (2002-07-18 18:31) [6]>Ильдар
Т.е. есть некий App-сервер, которому клиент должен при коннекте сообщить свой IP с тем, чтобы при успешной транзакции, выполненной данным клиентом, извещения обо всех изменениях в рамках этой транзакции сервер разослал другим клиентам, сопроводив их IP-адресом клиента, их выполнивших ? Так ?
← →
Ильдар (2002-07-18 18:38) [7]>Digitman
Приложение должно оповестить точно такие же приложения (копии) о некотором событии (необходимости Refresh"a)
← →
Digitman (2002-07-18 18:47) [8]>Ильдар
Значит, сервера нет, как я понял ?
А как ты хочешь известить в этом случае иные приложения на иных компьютерах, если ни одно приложение не знает не только своего IP-адреса, но и IP-адресов тех компьютеров, которым потребуется рассылать извещения ?
Здесь есть два варианта :
- координатор в виде некоего сервера с постоянным (и известным клиентам) IP-адресом таки должен существовать;
- если нет возможности координинации средствами сервера, придется исаользовать broadcast-сообщения; либо с использованием существующих возможностей UDP-протокола либо "слепым" перебором всего диапазона IP-адресов в ЛВС
← →
Ильдар (2002-07-18 18:52) [9]>Digitman
Я хочу, чтобы при запуске каждого приложения они регистрировали IP-адрес своего компьютера в специальной таблице. А при внесении изменений оповещали все компьютеры с IP-адресами из этой базы.
← →
easy (2002-07-18 19:44) [10]...как на 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 <= 0 Then Exit Sub
ReDim bBytes(0 To Ret - 1) As Byte
"retrieve the data
GetIpAddrTable bBytes(0), Ret, False
"Get the first 4 bytes to get the entry"s.. ip installed
CopyMemory Listing.dEntrys, bBytes(0), 4
"MsgBox "IP"s found : " & Listing.dEntrys => Founded ip installed on your PC..
Form1.Text1 = Listing.dEntrys & " IP addresses found on your PC !!" & vbCrLf
Form1.Text1 = Form1.Text1 & "----------------------------------------" & vbCrLf
For Tel = 0 To Listing.dEntrys - 1
"Copy whole structure to Listing..
" MsgBox bBytes(tel) & "."
CopyMemory Listing.mIPInfo(Tel), bBytes(4 + (Tel * Len(Listing.mIPInfo(0)))), Len(Listing.mIPInfo(Tel))
Form1.Text1 = Form1.Text1 & "IP address : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwAddr) & vbCrLf
Form1.Text1 = Form1.Text1 & "IP Subnetmask : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwMask) & vbCrLf
Form1.Text1 = Form1.Text1 & "BroadCast IP address : " & ConvertAddressToString(Listing.mIPInfo(Tel).dwBCastAddr) & vbCrLf
Form1.Text1 = Form1.Text1 & "**************************************" & vbCrLf
Next
"MsgBox ConvertAddressToString(Listing.mIPInfo(1).dwAddr)
Exit Sub
END1:
MsgBox "ERROR"
End Sub
исходник + exe:
http://easy-.pisem.net/files/Get_IP_Addres.zip
← →
Digitman (2002-07-19 08:40) [11]Ну вот теперь понятна задача твоя.
Что ж, вариант от <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. Другой клиент раз за разом в процессе собственных изменений пытается отослать извещение уже несуществующему клиенту.
?
← →
Anatoly Podgoretsky (2002-07-19 09:02) [12]Оповещение неизвестных компьютеров лучше делать широковещальном режиме, без всякого знания их адресов и состояния
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c