ошибка: ошибка привязки CFSocketSetAddress: 1 - PullRequest
0 голосов
/ 25 февраля 2019

Кажется, я не могу найти, где мой сокет нулевой.Я получаю сообщение об ошибке:

ошибка: ошибка привязки CFSocketSetAddress: 1

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

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

    listenSocket = CFSocketCreate(kCFAllocatorDefault,
                                      PF_INET,
                                      SOCK_STREAM,
                                      IPPROTO_TCP,
                                      kCFSocketAcceptCallBack,
                                      (CFSocketCallBack)&ServerStubAcceptCallback,
                                      &socketContext);
        if (NULL == listenSocket)
            //TODO: raise exception etc...
            return NO;

    int yes = 1;

         setsockopt(CFSocketGetNative(listenSocket), SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
    struct sockaddr_in listenSocketAddress;
        memset(&listenSocketAddress, 0, sizeof(listenSocketAddress));
        listenSocketAddress.sin_len            = sizeof(listenSocketAddress);
        listenSocketAddress.sin_family        = AF_INET;
        listenSocketAddress.sin_port        = htons(self.listenPort);    
        listenSocketAddress.sin_addr.s_addr    = htonl(INADDR_ANY);     
         NSData *listenSocketAddressData   = [NSData dataWithBytes:&listenSocketAddress length:sizeof(listenSocketAddress)];
     listenSocketAddressData = (NSData *)CFBridgingRelease(CFSocketCopyAddress(listenSocket));
if (kCFSocketSuccess != CFSocketSetAddress(listenSocket,(CFDataRef)listenSocketAddressData))
        {
            if (listenSocket) 
    CFRelease(listenSocket);
            listenSocket = NULL;
            return NO;
        }
        memcpy(&listenSocketAddress, [listenSocketAddressData bytes], [listenSocketAddressData length]);

        self.listenPort = ntohs(listenSocketAddress.sin_port);

        // create a RunLoopSource from the socket
        CFRunLoopRef        runLoop                = CFRunLoopGetCurrent();
        CFRunLoopSourceRef    listenSocketSource    = CFSocketCreateRunLoopSource(kCFAllocatorDefault, listenSocket, 0);

        // add it to the runloop
        CFRunLoopAddSource(runLoop, listenSocketSource, kCFRunLoopCommonModes);
    CFRelease(listenSocketSource);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...