2017-04-17 14 views
0

単純なサーバーソケットをプログラムしようとしています。クライアントに接続できます。しかし、私が切断して、サーバーソケットを再確立しようとすると、バインド中にエラーが発生しました(errno = 48、EADDRINUSE)。誰でもそれを修正する方法を知っていますか?スウィフト - サーバーソケットが再バインドできません

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))); 
関連する問題