Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 浏览器上的GCDAsyncSocket使用“立即连接和断开连接”;“远程对等方关闭的套接字”;错误_Sockets_Swift_Network Programming_Ios8_Gcdasyncsocket - Fatal编程技术网

Sockets 浏览器上的GCDAsyncSocket使用“立即连接和断开连接”;“远程对等方关闭的套接字”;错误

Sockets 浏览器上的GCDAsyncSocket使用“立即连接和断开连接”;“远程对等方关闭的套接字”;错误,sockets,swift,network-programming,ios8,gcdasyncsocket,Sockets,Swift,Network Programming,Ios8,Gcdasyncsocket,我对网络编程和第一次使用GCDAsyncSocket非常陌生。我正在尝试实现一个iOS应用程序,其中1个设备充当主机,其他设备(浏览器)连接到它。我正在使用NSNetService/NSNetService浏览器发布/浏览部件 现在,我的客户端/浏览器正确解析主机地址,并尝试使用以下代码连接到主机: func netServiceDidResolveAddress(sender: NSNetService) { // Connect with Service if (self.con

我对网络编程和第一次使用GCDAsyncSocket非常陌生。我正在尝试实现一个iOS应用程序,其中1个设备充当主机,其他设备(浏览器)连接到它。我正在使用NSNetService/NSNetService浏览器发布/浏览部件

现在,我的客户端/浏览器正确解析主机地址,并尝试使用以下代码连接到主机:

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

private func connectWithService(service: NSNetService, hostname: String) ->Bool {

    var isConnecting:Bool = false;



    if (self.browserSocket == nil || !(self.browserSocket?.isConnected)!) {

        // Initialize Socket

        self.browserSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue());



        // Connect

        while (!isConnecting){

            var error: NSError?;

            println("Connecting port : \(service.port) and hostname: \(hostname)");

            if (self.browserSocket.connectToHost(hostname, onPort: UInt16(service.port), 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;

}

// GCDAsyncSocketDelegate methods

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
   println("Socket: \(sock) 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 \(sock) did disconnect with error \(err?)");

 }
以下是发布者代码:

重写func viewDidLoad(){

现在,客户端与主机连接并点击以下方法:

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
但随后它立即断开以下方法的连接,错误代码为7“套接字被远程对等方关闭”

以下是来自浏览器设备的控制台日志:

Service found is : <NSNetService 0x15e2f710> local. _mpstest._tcp. iPad 30
Connecting port : 50797 and hostname: iPad-30.local.
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50797 and hostname: iPad-30.local.
Socket <GCDAsyncSocket: 0x15d80020> did disconnect with error Optional(Error Domain=kCFStreamErrorDomainNetDB Code=8 "nodename nor servname provided, or not known" UserInfo=0x15e3c7a0 {NSLocalizedDescription=nodename nor servname provided, or not known})
Connecting port : 50797 and hostname: iPad-30.local.
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50797 and hostname: iPad-30.local.
Socket: <GCDAsyncSocket: 0x15e59c20> Did connect to host: 169.254.78.98 on port:50797
Socket <GCDAsyncSocket: 0x15e59c20> did disconnect with error Optional(Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer" UserInfo=0x15e5b070 {NSLocalizedDescription=Socket closed by remote peer})
找到的服务是:本地.\u mpstest.\u tcp.iPad 30
连接端口:50797,主机名:iPad-30.local。
正在连接服务:domainName=local.,type=_mpstest._tcp.,name=iPad 30,onPort=50797,主机名:iPad-30.local。
套接字未断开连接,错误为可选(错误域=kCFStreamErrorDomainNetDB代码=8“提供了nodename或servname,或未知”UserInfo=0x15e3c7a0{NSLocalizedDescription=nodename或servname,或未知})
连接端口:50797,主机名:iPad-30.local。
正在连接服务:domainName=local.,type=_mpstest._tcp.,name=iPad 30,onPort=50797,主机名:iPad-30.local。
套接字:未连接到端口50797上的主机:169.254.78.98
套接字未断开连接,错误为可选(错误域=GCDAsyncSocketErrorDomain代码=7“套接字由远程对等方关闭”用户信息=0x15e5b070{NSLocalizedDescription=套接字由远程对等方关闭})
永远不会命中主机套接字委托方法

我真的被困在这里了。任何关于我在这里做错了什么的帮助都会很好

谢谢
Vik

我也犯了同样的错误!在进行了大量搜索并拔出头发后,我偶然发现了一个解决方案,该解决方案与GCDAsyncSocket的弱声明有关,ARC in Swift将GCDAsyncSocket.m中的声明“u弱”理解为尽快释放套接字的借口

在项目中搜索关键字“\uuu-weak”,并删除所有引用。
在以下位置找到此解决方案:

在目标C中也有相同的问题:我也有完全相同的问题。由于这是几个月前的问题,您是否解决过此问题?如果是,我希望得到一个提示:)套接字在收到第一个请求的响应后获取disconnet。
func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) {
Service found is : <NSNetService 0x15e2f710> local. _mpstest._tcp. iPad 30
Connecting port : 50797 and hostname: iPad-30.local.
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50797 and hostname: iPad-30.local.
Socket <GCDAsyncSocket: 0x15d80020> did disconnect with error Optional(Error Domain=kCFStreamErrorDomainNetDB Code=8 "nodename nor servname provided, or not known" UserInfo=0x15e3c7a0 {NSLocalizedDescription=nodename nor servname provided, or not known})
Connecting port : 50797 and hostname: iPad-30.local.
Connecting with service: domainName= local., type= _mpstest._tcp., name= iPad 30, onPort= 50797 and hostname: iPad-30.local.
Socket: <GCDAsyncSocket: 0x15e59c20> Did connect to host: 169.254.78.98 on port:50797
Socket <GCDAsyncSocket: 0x15e59c20> did disconnect with error Optional(Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer" UserInfo=0x15e5b070 {NSLocalizedDescription=Socket closed by remote peer})