• 0
neohost

TidIPWatch [TidIPWatch] Узнаём локальный IP

Вопрос

Здравствуйте форумчане. Возникла проблема с определением IP адреса на андроид устройстве. Компьютер и андроид подключены к Wi-Fi роутеру. У компьютера адрес 192.168.1.101, у андроида 192.168.1.105. Выше-озвученный компонент под windows показывает корректный адрес, под андроидом 127.0.0.1. Почему??? И как корректно определить внутренний IP адрес?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 ответа на этот вопрос

  • 0

Ответ от разработчика Indy:

That being said, Indy has trouble retrieving local IP addresses on Android. That has not been addressed yet.

 

Подробности дискуссии c ним на его любимом форуме С++ Builder: http://bcbj.org/forums/viewtopic.php?f=10&t=2591&sid=4b30cbf2c9aafa3d9ca60797d7e86bf0

 

P.S.

Всем рекомендую вопросы по Indy туда на этот форум (не важно код  Дельфи или С++) там всегда ответ из первых рук - главного разработчика Indy rlebeau

Изменено пользователем Kitty

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

можно использовать вот это

Изменено пользователем ZuBy
Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Kitty спасибо за совет, я предпочитаю общаться на Русских форумах

ZuBy спасибо за ссылку, функция работает корректно

uses
{$IFDEF ANDROID}
 AndroidApi.JNI.Net,
 AndroidApi.JNI.JavaTypes,
 AndroidApi.JNIBridge,
 AndroidApi.JNI.GraphicsContentViewText,
 AndroidApi.Helpers,
{$ENDIF}
...

{$IFDEF ANDROID}
function TfrmMain.GetAddress: string;
var
  WifiManagerObj: JObject;
  WifiManager: JWifiManager;
  WifiInfo: JWifiInfo;
  ip: Integer;
begin
  WifiManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
  WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
  WifiInfo := WifiManager.getConnectionInfo();
  ip := WifiInfo.GetIPAddress;
  Result := Format('%d.%d.%d.%d', [ip and $FF, ip shr 8 and $FF, ip shr 16 and $FF, ip shr 24 and $FF]);
end;
{$ENDIF}
Изменено пользователем neohost

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Рагим
      Доброго времени суток.
      Есть приложение на Windows (сервер) и есть от 1 до 4 приложений (клиенты) на Андроид. Все устройства в сети. IP адреса клиентов не известны серверу, а адрес сервера клиентам. Приложения после того как узнают адреса друг друга, будут обмениваться сообщениями через TIdTcpClient и TIdTcpServer. 
      Как лучше реализовать распознавание клиентов в сети? Делаю сейчас используя Tethering, но способ мне не нравится.
    • Автор: Morfi
      Здравствуйте!
      Пытаюсь реализовать алгоритм PBKDF2-SHA1. Для вычисления HMAC-SHA1 использую класс TidHMACSHA1.
      Код PBKDF2-SHA1 нашел на просторах интернета и немного подкорректировал для использования с INDY (TidHMACSHA1):
      function PBKDF2Sha1(pass, salt: string; count, kLen: Integer): string; function IntX(i: Integer): string; inline; begin Result := Char(i shr 24) + Char(i shr 16) + Char(i shr 8) + Char(i); end; var D, I, J: Integer; T, F, U, wPass: TIdBytes; begin wPass := ToBytes(pass); D := Ceil(kLen / (160 div 8)); for i := 1 to D do begin F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass); U := F; for j := 2 to count do begin U := EncryptHMACSha1(U, wPass); //<-- Проблема F := XorBlock(F, U); end; T := T + F; end; Result := ToHex(Copy(T, 1, kLen)); end; Для вычисления HMAC-SHA1 используется функция EncryptHMACSha1:
      function EncryptHMACSha1(Input, AKey: TIdBytes): TIdBytes; var HMachSha1: TIdHMACSHA1; begin HMachSha1 := TIdHMACSHA1.Create; try HMachSha1.Key := AKey; Result := HMachSha1.HashValue(Input); finally HMachSha1.Free; end; end; Возникает проблема, когда эта функция используется 6-й раз в функции PBKDF2Sha1:
      for i := 1 to D do // D := 2 begin F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass); // Использование функции (разы): 1-й, 4-й U := F; for j := 2 to count do // count := 3 begin U := EncryptHMACSha1(U, wPass); // <--Проблема! Использование функции (разы): 2-й, 3-й, 5-й, !6-й! F := XorBlock(F, U); end; T := T + F; end; Возникает исключение в глубинах INDY-кода:

      а точнее в функции TIdHashSHA1.NativeGetHashBytes (файл: idHashSHA,pas) на строке с кодом:
      SetLength(Result, SizeOf(UInt32)*5); // в файле строка под номером 460 Помогите решить данную проблему.
       
      Версии:
      Delphi: 10.1
      INDY: 10.6.2.5341
    • Автор: serg557
      Вопрос заключается в следующем - есть сервер сделанный в VCL
      Server1->DefaultPort=6590 void __fastcall TForm3::Server1Execute(TIdContext *AContext) // на запрос от клиента { TIdIOHandler *a = AContext->Connection->IOHandler; UnicodeString res = a->ReadLn(IndyUTF8Encoding(true)); if (res == "zapros") { if (ListBox1->Items->Strings[0]!="") { a->WriteLn(ListBox1->Items->Strings[0],IndyUTF8Encoding(true)); a->WriteLn(ListBox3->Items->Strings[0],IndyUTF8Encoding(true)); ListBox2->Items->Add("("+AContext->Connection->Socket->Binding->IP+")"+ListBox1->Items->Strings[0]); } есть клиент написанный на vcl
      //порт указан вручную Client1->Host =Edit2->Text; if (Client1->Connected()==false) { try { Client1->Connect(); } catch(...) { ShowMessage("Не удалось подключиться"); } } TIdIOHandler *a = Client1->IOHandler; a->WriteLn("zapros",enUTF8); Edit1->Text=a->ReadLn(enUTF8); Edit5->Text=a->ReadLn(enUTF8); a->Free(); } рабочий, захотел переложить его на FMX:
      Client1->Port=6590; Client1->Host=Edit1->Text; if (Client1->Connected()==false) { try { Client1->Connect(); } catch(...) { Client1->Socket->Close(); ShowMessage("Не удалось подключиться"); } } TIdIOHandler *a = Client1->IOHandler; a->WriteLn("zapros",IndyUTF8Encoding(true)); Edit3->Text=a->ReadLn(IndyUTF8Encoding(true)); Edit5->Text=a->ReadLn(IndyUTF8Encoding(true)); Client1->Socket->Close(); a->Free(); } выдает ошибку 
       Может подскажет кто-как их помирить? (Сервер переписывать не вариант  )
    • Автор: ivadimos
      Собственно в IdTCPClient возникает Max line length exceeded при чтении.
      Шаманы в интернетах советуют поменять величину константы IdMaxLineLengthDefault.
      Есть ли другие способы решения?
    • Автор: AndreyS
      День добрый! Пишу приложение, которое периодически загружает информацию с сайта. Способ простейший - 
      SiteResult := IdHTTP.Get('http://example.com/'); На компе стоит dr. web. Обычно, когда какое-либо приложение пытается получить данные из сети, вываливается стандартное окошко брандмауэра, мол, так и так, данное приложение пытается получить доступ к сети, разрешить, заблокировать или создать для него правило. В моем же случае такого не происходит. Просто при выполнении  указанной строки кода появляется сообщение об ошибке сокета #10013 Access Denied в независимости от указанного адреса (включая localhost). При попытке отправки POST-запроса - та же история. При отключении брандмауэра dr. web все запросы отрабатываются без осложнений)). В чем может быть причина? Может у TidHTTP должны быть определенным способом заполнены какие-то свойства?
    • Автор: iworm2009
      Здравствуйте. Нет в дизайн тайм соответствующего компонента.
      Как сделать, чтобы idHttp не блокировал форму при скачивании файла?
    • Автор: brunnengi
      Здравствуйте.
      Был проект на Delphi7, решил пересадить его на FMX. Приложение на аднройде (сделан в эклипсе) отправляет GET запрос с русскими символами.
      Принимаю запрос через idHTTPServer. Но русские буквы не распознаются. Кодировка в которой отправляет приложение на андройде ISO-8859-1. Как сделать так что бы idhttpserver правильно прочел эти данные. И мог в также ответить клиенту.
      Перепробовал кучу советов в инете, но все не работает.
    • Автор: rareMax
      Приветствую! Пишу компоненты для работы с VK API. Там все операции(рекомендовано) с АПИ проходят по защищенному соединению. Интересует можно ли использовать в приложении для Android idHttp по защищенному протоколу SSL. В Windows необходимо было таскать Dll'ку с приложением. Что делать если будет разработка не только для Windows?  Спасибо.
    • Автор: kidrock1
      Друзья, всем привет. Возникла следующая проблема. Использую IdFTP для закачки файла на сервер. Всё получается хорошо. Я коннектюсь к серверу и посылаю на него файл, но файл на сервере оказывается битым и отличается по размеру от оригинала. Вот код:
      procedure TForm5.Button2Click(Sender: TObject); var IdFTP:TIdFtp; begin   IdFTP:=TIdFTP.Create(nil);   if IdFTP.Connected then   begin     IdFTP.Abort;     IdFTP.Quit;   end;   IdFTP.Username := '************.ru';   IdFTP.Password := 'ыыыыыыыыыыыы';   IdFTP.Host := 'чччччччччччч';   IdFTP.Port := 21;   try       IdFTP.Connect;       IdFTP.ChangeDir('/test');       IdFTP.Put('E:\test\in\1.jpg', '1.jpg', False);       IdFTP.Quit;   except       ShowMessage('xep');   end;  IdFTP.free; end;  
    • Автор: rareMax
      Подскажите, как правильно проверить, есть ли папка на FTP сервере?
      Сейчас делаю так:
      function TFTP_As.FtpPathExist(Path: String): boolean; begin   Result := false;   try     fFtp.MakeDir(Path);   except     Result := true;   end; end; Но при большом кол-ве папок тяжело отлаживать программу - уж слишком много except"ов. Можно ли как-то иначе сделать эту проверку? 
      Спасибо.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу