Всем привет!
У меня уже несколько лет работают приложения под 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); // Прием