Перейти к содержанию
Fire Monkey от А до Я
  • 0

Wifi Multicast packets


msp888

Вопрос

Всем привет! 

У меня уже несколько лет работают приложения под Windows и под Andriod, в которых выполняется обмен данными по локальной сети по протоколу TCP-IP. Теперь вот мне понадобился прием multicast-пакетов по протоколу UDP. Под Windows всё работает замечательно, а вот под Android ничего принять не могу... 

Подскажите чего не хватает, или дайте ссылку на пример, где уже реализовано подобное...

Вот выдержки из кода:

// переменные
FSocket:TSocket;
FiAR:IAsyncResult;  
FasyncWE:TMultiWaitEvent;
data:TBytes;
res:TWaitResult;

WifiLock: JWifiManager_WifiLock;
MulticastLock: JWifiManager_MulticastLock;

...

// регистрация в группе
procedure AddMemberShip(MultiAddr, InterfaceAddr:Cardinal);
var
  Mreq:ip_mreq;
begin
  fillchar(Mreq, SizeOf(Mreq), 0);
  move(MultiAddr, Mreq.IMR_MultiAddr.S_addr, SizeOf(Mreq.IMR_MultiAddr.S_addr));
  move(InterfaceAddr, Mreq.IMR_Interface.S_addr, SizeOf(Mreq.IMR_Interface.S_addr));

  CheckSocketResult(setsocketoption(FSocket.Handle, IPPROTO_IP, IP_ADD_MEMBERSHIP, Mreq, SizeOf(Mreq)), 'setsockopt:IP_ADD_MEMBERSHIP');
end;

...

// permission...
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ACCESS_NETWORK_STATE
ACCESS_WIFI_STATE
CHANGE_CONFIGURATION
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
INTERNET
READ_CALENDAR
READ_EXTERNAL_STORAGE
WRITE_CALENDAR
WRITE_EXTERNAL_STORAGE
WAKE_LOCK

...

// настройка wi-fi
WifiLock.acquire;
MulticastLock.acquire;

...

// создание и настройка сокета
FSocket:=TSocket.Create(TSocketType.UDP);
FSocket.Bind(TNetEndpoint.Create(ServerIP, ServerPort));
AddMemberShip(TIPAddress.Create(239, 78, 1, 1).Addr.S_addr,  ServerIP.Addr.S_addr);
AddMemberShip(TIPAddress.Create(239, 78, 1, 2).Addr.S_addr,  ServerIP.Addr.S_addr);
AddMemberShip(TIPAddress.Create(239, 78, 1, 78).Addr.S_addr, ServerIP.Addr.S_addr);


...
// Прием данных в потоке...
  FiAR:=FSocket.BeginReceiveFrom;
  FasyncWE:=FiAR.AsyncWaitEvent;
  res:=FasyncWE.WaitFor;

  if res = wrSignaled then
    data:=FSocket.EndReceiveBytesFrom(FiAR); // Прием

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Жаль, что никто не помог...

Проблему решил.

Как всегда embarcadero ничего не доводит до конца!

Обертка для мультиплатформенного сокета (TSocket)  криво работает как под windows так и под android.

Для работы с Multicast-пакетами под android используйте JMulticastSocket из android api.

Ссылка на комментарий
  • 0

Я использую для такого Indy, там все готовенькое, в том числе и TIdUDPServer со всем нужным вам функционалом (и потоками).

Вот в теме немного обсуждения 

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...