почему GCDAsyncUdpSocket не может отправлять/получать пакеты через некоторое время в широковещательном режиме?

Я использую GCDAsyncUdpSocket для записи сокета UDP в своем приложении. Сценарий такой: когда пользователь нажимает кнопку, он отправляет широковещательный пакет в локальную сеть, затем прослушивает ответ, в локальной сети есть сервер, который ответит одним UDP-пакетом. Когда приложение получит ответ, оно что-то сделает.

Я установил GCDAsyncUdpSocket следующим образом:

- (void)setupSocket
{
    _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;

    if (![_udpSocket bindToPort:18686 error:&error]) {
        NSLog(@"Error binding: %@",error);
        return;
    }

    if (![_udpSocket beginReceiving:&error]) {
        NSLog(@"Error receiving: %@",error);
        return;
    }

    if (![_udpSocket enableBroadcast:YES error:&error]) {
        NSLog(@"Error enableBroadcast: %@",error);
        return;
    } 
}

затем я отправляю пакет в действие кнопки следующим образом:

NSString *host = @"255.255.255.255";
int port = 8585;
NSString *msg = @"Hello from iOS";
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[_udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0]; 

in

- (void)udpSocket:(GCDAsyncUdpSocket *)sock     didReceiveData:(NSData *)data
                                                fromAddress:(NSData *)address
                                                withFilterContext:(id)filterContext

метод я слушаю порт, чтобы сделать что-то. Сначала он работает отлично, но если вы попытаетесь нажать кнопку позже (около 1 часа), то он больше не сможет отправить UDP-пакет.

Мой сервер в локальной сети распечатает полученные данные. Я думал, что что-то не так с методом отправки. поэтому я использую методы сокета BSD для отправки данных. и используйте GCDAsyncUdpSocket для получения ответа. но то же самое произошло через некоторое время. на этот раз я могу отправить, но не могу получить.

Я что-то упустил о GCDAsyncUdpSocket? почему он не может отправить/получить через некоторое время? Любая помощь приветствуется.


person chancyWu    schedule 10.01.2014    source источник
comment
У меня такая же проблема, вы нашли причину этого?   -  person Vineesh TP    schedule 25.07.2016


Ответы (1)


Это может быть какая-то настройка тайм-аута. Реализуйте протокол GCDAsyncUdpSocketDelegate для получения подробной информации о том, что происходит.

Сложное решение — установить новое соединение.

person Karsten    schedule 28.11.2016