Mam urządzenie w sieci, które wysyła bardzo mały plik przez UDP. Aplikacja IOS, którą tworzę, jest odpowiedzialna za przeczytanie tych pakietów i wybrałem do tego celu użycie GCDAsyncUdpSocket. Plik jest wysyłany co pół sekundy, jednak nie odbieram go prawie tak często (otrzymuję tylko co 3-10 sekund).GCDAsyncUdpSocket na brakujących datagramach multicastowanych w systemie iOS
Myśląc, że to może być problem z urządzeniem, zacząłem monitorować ruch z Wireshark. Wygląda na to, że odzwierciedla to, co widziałem w mojej aplikacji, dopóki nie włączyłem "trybu monitorowania" w Wireshark, w którym to momencie przechwytywano każdy pakiet UDP. Ponadto symulator iOS zaczął otrzymywać wszystkie brakujące pakiety, ponieważ dzieli się kartą sieciową z komputerem Mac, na którym się rozwijam.
Czy istnieje sposób, aby włączyć "Tryb monitorowania" na urządzeniu z systemem iOS lub coś, czego mi brakowało, aby umożliwić dostęp do brakujących pakietów? Widzę również, że istnieje metoda ReadStream w GCDAsyncUdpSocket. Być może muszę użyć tego zamiast beginReceiving? Chociaż nie wiem, jak skonfigurować strumienie w Objective-C, jeśli tak jest.
Oto mój kod testu, jak jest teraz:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"View Loaded");
[self setupSocket];
}
- (void)setupSocket
{
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![udpSocket bindToPort:5555 error:&error])
{
NSLog(@"Error binding to port: %@", error);
return;
}
if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){
NSLog(@"Error connecting to multicast group: %@", error);
return;
}
if (![udpSocket beginReceiving:&error])
{
NSLog(@"Error receiving: %@", error);
return;
}
NSLog(@"Socket Ready");
}
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
NSLog(@"RCV: %@", msg);
}
else
{
NSString *host = nil;
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
NSLog(@"Unknown message from : %@:%hu", host, port);
}
}
rozwiązanie dla każdego, kto przychodzi szuka tu w przyszłości:
oparciu o odpowiedź ilmiacs męska, udało mi się znacznie zmniejszyć liczbę brakujących pakietów, wysyłając polecenie ping do docelowego urządzenia z systemem iOS. Korzystanie z komputera Mac, wpadłem to w terminalu -
sudo ping -i 0.2 -s 4 <Target IP>
Teraz mam to działa z Mac pingowanie urządzenie iOS, mam zamiar zajrzeć do przykładów ping Apple iOS i zobaczyć, czy mogę mieć urządzenie ping sam w celu stymulacji własnego adaptera bezprzewodowego (127.0.0.1).
zdajesz sobie sprawę, że pakiety UDP ** nie są ** gwarantowane, że zostaną dostarczone przez projekt? Twoja aplikacja musi być w stanie obsłużyć tę sprawę. –
Tak, wiem, że UDP jest niewiarygodny, ale czy to naprawdę może być przyczyną tego, że wiele pakietów nie zostanie przechwyconych? Ponadto aplikacja otrzymuje każdy pakiet bez problemu, o ile karta sieciowa ma włączony tryb monitorowania. – Squatch
@ Czy możesz sprawdzić, z którego urządzenia korzystałeś? –