GCDAsyncUdpSocket, невозможно привязать сокет более одного раза

Я использую GCDAsyncUdpSocket для передачи UDP между iphone и удаленным сервером UDP. Я отправляю небольшое приветствие на указанный порт на широковещательный адрес 255.255.255.255.

Затем сервер отвечает, что позволяет мне узнать его IP-адрес.

Все работает нормально, особенно с использованием симулятора, за исключением того, что если я запускаю его один раз на iphone, когда я пытаюсь остановить приложение и сразу же запустить его, я получаю ошибку «Невозможно привязать сокет более одного раза». Это происходит, когда я нажимаю кнопку «Стоп» в xcode или когда убиваю приложение в IOS.

Вот образец моего кода:

#import "GCDAsyncUdpSocket.h"

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (udpSocket == nil)
    {
        [self setupSocket];
    }
}

- (void)setupSocket
{

    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    [udpSocket enableBroadcast:YES error:nil];


    NSData *data = [@"hello" dataUsingEncoding:NSUTF8StringEncoding];
    [udpSocket sendData:data toHost:@"255.255.255.255" port:21180 withTimeout:-1 tag:tag++];

    NSError *error = nil;

    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:FORMAT(@"Error binding: %@", error)];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:FORMAT(@"Error receiving: %@", error)];
        return;
    }
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    if (msg)
    {
        [self logMessage:FORMAT(@"RECV: %@", msg)];
    }
    else
    {
        NSString *host = nil;
        uint16_t port = 0;
        [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];

        [self logInfo:FORMAT(@"RECV: Unknown message from: %@:%hu", host, port)];
    }
    [udpSocket close];
    udpSocket = NIL;

}

На самом деле кажется, что ссылка на сокет все еще привязана, игнорируя действие закрытия и устанавливая значение nil.

Любые советы приветствуются, спасибо за чтение.

FKY


person Funkycochise    schedule 29.06.2013    source источник
comment
Возможно, это поможет: stackoverflow.com / questions / 16838513 / (установите параметр сокета SO_REUSE).   -  person Martin R    schedule 29.06.2013
comment
спасибо, тоже думал разберутся, но не получается.   -  person Funkycochise    schedule 29.06.2013
comment
Вы решили эту проблему?   -  person RMRAHUL    schedule 09.11.2017


Ответы (1)


Сокет привязывается автоматически, когда вы вызываете send. Так что пытаться связать его снова уже слишком поздно. Обычно вам вообще не нужно предлагать цену для UDP-сокета, если только у вас нет требований к фиксированному номеру порта, которого здесь нет. Просто удали его.

person user207421    schedule 30.06.2013
comment
HI EJP предположим, что в той же ситуации у нас есть фиксированный номер порта, чем какое-то решение. - person Anjan; 10.02.2016
comment
@Anjan Склейте его перед отправкой или получением. - person user207421; 13.10.2016