2017-04-17 43 views
0

我想编写一个简单的服务器套接字。连接到客户端是成功的。但在断开连接并尝试重新建立服务器套接字后,在绑定过程中出现错误(errno = 48,EADDRINUSE)。谁知道怎么修它?Swift - 服务器套接字无法重新绑定

func initServerSocket(serverSocket: Int32) -> Int32 { 

    var clientSocket: Int32 = -1 
    var server_addr_size: Int 
    var client_addr_size = socklen_t(MemoryLayout<sockaddr_in>.size) 


    var server_addr = sockaddr_in() 
    var client_addr = sockaddr_in() 

    server_addr_size = MemoryLayout<sockaddr_in>.size 
    memset(&server_addr, 0, server_addr_size); 

    server_addr.sin_family = sa_family_t(AF_INET) 
    server_addr.sin_port = UInt16(8080).bigEndian 
    server_addr.sin_addr.s_addr = UInt32(0x00000000) 


    let bind_server = withUnsafePointer(to: &server_addr) { 
     $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { 
      bind(serverSocket, $0, socklen_t(MemoryLayout<sockaddr_in>.stride)) 
     } 
    } 

    if bind_server == -1 { 
     print("[Fail] Bind Port, Error: \(errno)"); 
     exit(1); 
    } else { 
     print("[Success] Binded Port \(bind_server)"); 
    } 

    if listen(serverSocket, 5) == -1 { 
     print("[Fail] Listen"); 
     exit(1); 
    } else { 
     print("[Success] Listening : \(server_addr.sin_port) Port ..."); 
    } 

    clientSocket = withUnsafeMutablePointer(to: &client_addr) { 
     $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { 
      accept(serverSocket, $0, &client_addr_size) 
     } 
    } 

    if clientSocket == -1 { 
     print("[Fail] Accept Client Connection \(errno)"); 
     exit(1); 
    } else { 
     print("[Success] Accepted Client : \(inet_ntoa(client_addr.sin_addr)!) : \(client_addr.sin_port)!"); 
    } 

    return clientSocket 
} 

断开功能:

func disconnect() { 
    if clientSocket != -1 { 
     self.inputStream.close() 
     self.outputStream.close() 

     if close(HiveConfig.clientSocket) == -1 { 
      print("serverSocket close error") 
     } 
     if close(HiveConfig.serverSocket) == -1 { 
      print("serverSocket close error") 
     } 
    } 
} 

回答

0

我弄清楚,在我的代码绑定之前,需要添加以下代码,以使重复使用的地址。

var opt:Int = 1 
    setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opt, socklen_t(MemoryLayout.size(ofValue: opt))); 
相关问题