GCDAsyncSocket никогда не подключается. Сбой с "Код ошибки =60, время ожидания истекло"

Я действительно новичок в сетевом программировании и пытаюсь реализовать приложение в iOS8/Swift с использованием фреймворка GCDAsyncSocket. Я могу опубликовать сервис с хост-устройства. Служба обнаруживается браузерным устройством, но когда браузер пытается подключиться к хосту, он никогда не подключается, и на устройстве браузера возвращается метод socketDidDisconnect с ошибкой "Тайм-аут операции", даже если я не установил ограничение тайм-аута.

Ниже приведен код моего браузера:

private func resolveServiceAddresses() {
    for service in self.services {
        service.delegate = self;
        service.resolveWithTimeout(30.0);
    }
 }

private func connectWithService(service: NSNetService) -> Bool {
    var isConnecting:Bool = false;

    //Copy Service Addresses
    let addresses = service.addresses;

    if (self.browserSocket == nil || !(self.browserSocket?.isConnected)!) {
        // Initialize Socket
        self.browserSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue());

        // Connect
        while (!isConnecting && (addresses?.count > 0 )){

            let address = addresses?[0] as NSData;

            var error: NSError?;
            if (self.browserSocket.connectToAddress(address, error: &error)) {
                isConnecting = true;
            } else if (error != nil) {
                println("Unable to connect to address. Error \(error) with user info \(error?.userInfo)");
            }
        }

    } else {
        println("Connecting is: \(self.browserSocket.isConnected)");
        isConnecting = self.browserSocket.isConnected;
    }

    return isConnecting;
}

// MARK: NSNetServiceBrowserDelegate methods

func netServiceBrowser(aNetServiceBrowser: NSNetServiceBrowser, didFindService aNetService: NSNetService, moreComing: Bool) {
    // This device is not advertising/publishing. So don't need any test before updating servies
    self.services.append(aNetService);

    if (!moreComing) {
        println("Service found is : \(aNetService)");
        self.resolveServiceAddresses();
    }
}

// MARK: NSNetServiceDelegate methods

func netService(sender: NSNetService, didNotResolve errorDict: [NSObject : AnyObject]) {
    sender.delegate = nil;
    println("Did not resolve service: domain:\(sender.domain) type:\(sender.type) name:\(sender.name) on port: \(sender.port) with error: \(errorDict)");
}

func netServiceDidResolveAddress(sender: NSNetService) {
    // Connect with Service
    if (self.connectWithService(sender)) {
        println("Connecting with service: domainName= \(sender.domain), type= \(sender.type), name= \(sender.name), onPort= \(sender.port)");
    } else {
        println("Unable to connect with service: domainName= \(sender.domain), type= \(sender.type), name= \(sender.name), onPort= \(sender.port)");
    }
}

// GCDAsyncSocketDelegate methods

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    println("Did connect to host: \(host) on port:\(port)");

    // Start Reading
    sock.readDataToLength(UInt(sizeof(UInt64)), withTimeout: -1.0, tag: 0);
}

func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) {
    println("Socket did disconnect with error \(err?)");

}

Ниже приведен журнал консоли для устройства Browser:

Service found is : <NSNetService 0x1454b490> local. _mpstest._tcp. iPad 30
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50490
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50490
Socket did disconnect with error nil
Socket did disconnect with error Optional(Error Domain=NSPOSIXErrorDomain Code=60 "Operation timed out" UserInfo=0x1465c350 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Operation timed out})

и вот код издателя / хоста:

override func viewDidLoad() {
    super.viewDidLoad()

    // Publish the service
    self.publishService();
}

// MARK: Button callbacks

private func publishService() {
    // Initialize GCDAsyncSocket
    self.socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue());

    // Start listening for incoming connections
    var error: NSError?;
    if (self.socket.acceptOnPort(0, error: &error)) {
        // Initialize Service
        self.service = NSNetService(domain: "local.", type: "_mpstest._tcp", name: UIDevice.currentDevice().name, port:0);

        // Configure Service
        self.service.delegate = self;
        self.service.includesPeerToPeer = true;
        self.service.publishWithOptions(.ListenForConnections);
    } else {
        println("Unable to create socket. Error \(error?.description) with user info \(error?.userInfo)");
    }
}

// MARK: NSNetServiceDelegate Methods

func netServiceDidPublish(sender: NSNetService) {
    println("Bonjour Service published: domainName= \(sender.domain), type= \(sender.type), name= \(sender.name), onPort= \(sender.port)");
}

func netService(sender: NSNetService, didNotPublish errorDict: [NSObject : AnyObject]) {
    println("Failed to publish service: domainName= \(sender.domain), type= \(sender.type), name= \(sender.name), onPort= \(sender.port) error= \(errorDict)");
}

// MARK: GCDAsyncSocketDelegate method

func socket(sock: GCDAsyncSocket!, didAcceptNewSocket newSocket: GCDAsyncSocket!) {
    println("Local socket with host:\(sock.connectedHost) and port:\(sock.connectedPort) accepts new socket with host:\(newSocket.connectedHost) and port:\(newSocket.connectedPort))");

    // Updating socket
    self.socket = newSocket;

    //Read data from socket
    let size = sizeof(UInt64);
    newSocket.readDataToLength(UInt(size), withTimeout: -1.0, tag: 0);
}

func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) {
    println("Socket with host:\(sock.connectedHost) and port:\(sock.connectedPort) is disconnected");
    if (self.socket == sock) {
        self.socket.delegate = nil;
        self.socket = nil;
    }
}

Ниже приведен журнал консоли для издателя / хоста:

Bonjour Service published: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50490

Я застрял здесь. Так что любая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам