Jestem nowy na rozwój iPhone'a i chcę zintegrować wake-on-lan z moją aplikacją, nie ściskając moich użytkowników, aby wprowadzili adres MAC komputera, gdy adres IP jest już znany. I googled przez kilka godzin, wziął kod źródłowy narzędzia ARP, ale nie wiem jak to zarządzać na iPhone.Jak przesłać zapytanie do tabeli ARP na telefonie iPhone?
Odpowiedz
Ponieważ nikt nie odpowiedział na moje pytanie ... tutaj jest odpowiedź;)
#include <sys/param.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#include "if_types.h"
#include "route.h"
#include "if_ether.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>
#include <errno.h>
#include <netdb.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-(NSString*) ip2mac: (char*) ip
{
int expire_time, flags, export_only, doing_proxy, found_entry;
NSString *mAddr = nil;
u_long addr = inet_addr(ip);
int mib[6];
size_t needed;
char *host, *lim, *buf, *next;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin;
struct sockaddr_dl *sdl;
extern int h_errno;
struct hostent *hp;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
err(1, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
err(1, "malloc");
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
err(1, "actual retrieval of routing table");
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;
sin = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)(sin + 1);
if (addr) {
if (addr != sin->sin_addr.s_addr)
continue;
found_entry = 1;
}
if (nflag == 0)
hp = gethostbyaddr((caddr_t)&(sin->sin_addr),
sizeof sin->sin_addr, AF_INET);
else
hp = 0;
if (hp)
host = hp->h_name;
else {
host = "?";
if (h_errno == TRY_AGAIN)
nflag = 1;
}
if (sdl->sdl_alen) {
u_char *cp = LLADDR(sdl);
mAddr = [NSString stringWithFormat:@"%x:%x:%x:%x:%x:%x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]];
// ether_print((u_char *)LLADDR(sdl));
}
else
mAddr = nil;
}
if (found_entry == 0) {
return nil;
} else {
return mAddr;
}
}
z jabłek arp.c działa na iPhone
Skopiuj następujące:
- "if_types.h"
- "route.h"
- "if_ether.h"
nagłówki z komputera Mac dołącza do folderu projektu i dodaje do klas:
Uprościliśmy de i naprawił wyciek pamięci.
Na moim komputerze pliki nagłówkowe znalezione w/usr/include/netinet i/usr/include/net.
- (NSString*)ip2mac:(in_addr_t)addr
{
NSString *ret = nil;
size_t needed;
char *buf, *next;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin;
struct sockaddr_dl *sdl;
int mib[6];
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &needed, NULL, 0) < 0)
err(1, "route-sysctl-estimate");
if ((buf = (char*)malloc(needed)) == NULL)
err(1, "malloc");
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), buf, &needed, NULL, 0) < 0)
err(1, "retrieval of routing table");
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;
sin = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)(sin + 1);
if (addr != sin->sin_addr.s_addr || sdl->sdl_alen < 6)
continue;
u_char *cp = (u_char*)LLADDR(sdl);
ret = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]];
break;
}
free(buf);
return ret;
}
Czy możesz podać jeden prosty kod demonstracyjny. Bcz nie jestem w stanie z niego skorzystać. Dzięki –
Nie jestem pewna funkcja sysctl jest częścią publicznych API. Użyłem tej metody jako oczywistej, a moja aplikacja została odrzucona z powodu użycia "niepublicznego" interfejsu API. Jednak nie wierzę, że jest jakikolwiek sposób na zrobienie tego innego niż metody przedstawione powyżej.
Witaj new299, więc jeśli używam tego dla legalnej i publicznej aplikacji, zostanie ona odrzucona ze sklepu z aplikacjami? – FujiRoyale
To było dla mnie, to było chwilę temu. Może warto spróbować. – new299
Wiem, że jest to wyłączone z tematu, ale czy możliwe jest znalezienie sposobu na identyfikację urządzeń w sieci programowo, które będą akceptowane przez władze Apple? Zapytałem o SO [tutaj] (http://stackoverflow.com/questions/26534050/nsnetservicebrowser-to-find-any-device-on-network) – FujiRoyale
- 1. Pierwsze tabeli ARP na iPhone/iPad
- 2. Rozpoznawanie mowy na telefonie iPhone
- 3. Java IDE * na * telefonie iPhone?
- 4. Debuguj niejasny błąd na telefonie iPhone
- 5. Wyskakujące powiadomienie o telefonie iPhone
- 6. Zrezygnuj z aplikacji Cydia do instalacji na nieobsługiwanym telefonie iPhone
- 7. Używanie NSRegularExpression do wyodrębniania adresów URL na telefonie iPhone
- 8. Jak uzyskać kod MCC i MNC na telefonie iPhone?
- 9. Jak przeanalizować wartość Json w telefonie iPhone?
- 10. Jak wykonać geokodowanie (NIE odwrotne geokodowanie) na telefonie iPhone?
- 11. Jak poprawić wydajność wkładki obiektu Core Data na telefonie iPhone?
- 12. Jak programowo odtwarzać pliki MP3 na telefonie iPhone?
- 13. Jak przekonwertować NSData na tablicę bajtów w telefonie iPhone?
- 14. Kroki, aby przesłać aplikację na telefon iPhone do AppStore
- 15. Jak wykonać wbudowany montaż w telefonie iPhone?
- 16. Jak zatrzymać UIView CABasicAnimation w telefonie iPhone
- 17. Jak zaimplementować wykres słupkowy w telefonie iPhone?
- 18. Jak zapisać zapytanie SQL do tabeli?
- 19. przesłać obraz z iPhone do folderu na serwerze
- 20. Jak zmienić domyślny kolor przycisku na telefonie iPhone?
- 21. Jak przesłać zapytanie do tabeli IPv6 NDP (sąsiednie protokoły wykrywania) dla określonego sąsiada
- 22. Jak przesłać zapytanie do tabeli pamięci masowej Azure za pomocą Linq?
- 23. Zainstaluj aplikację webapp na ekranie głównym na telefonie iPhone?
- 24. Jak usunąć kolor stylu komórki po ponownym wyświetleniu widoku tabeli w telefonie iPhone?
- 25. Używanie uwierzytelniania HTTP Digest w telefonie iPhone
- 26. Pobieranie obrazów i zapisywanie lokalnie na telefonie iPhone Aplikacja Phonegap
- 27. Testowanie poza warunkami kosmicznymi w telefonie iPhone
- 28. Tworzenie pliku PDF z pliku CSV na telefonie iPhone
- 29. Suma pamięci RAM w telefonie iPhone
- 30. Nazwa czcionki niesystemowej w telefonie iPhone
Dzięki za cynk. Skopiowałem tylko nagłówek "route.h", ponieważ pozostałe są zawarte w pakietach SDK (3.2+). –
cześć, @ anthony iam otrzymuję błąd niezadeklarowanego identyfikatora nflag, co muszę uwzględnić, aby to zadziałało.? – Bonnie
po prostu dodaj górę pliku static int nflag; –