SwiftSocket icon indicating copy to clipboard operation
SwiftSocket copied to clipboard

UDPClient: hanging on recv()

Open 7stud opened this issue 7 years ago • 1 comments

Can anyone spot any obvious errors in my code:

            let udpClient = UDPClient(address: "127.0.0.1", port: 12033)
            
            switch udpClient.send(string: "Hello") {
            case .success:
                print("Client sent message to server.")
            case .failure(let error):
                print("Client failed to send message to server: \(error)")
            }
            
           //  **** THIS recv() NEVER RETURNS ****
            print("entering client's recv()")
            let(byteArray, senderIPAddress, senderPort) = udpClient.recv(1024)
            print("client's recv() returned")
            
            if let byteArray = byteArray,
               let string = String(data: Data(byteArray), encoding: .utf8)
            {
                print("Cient received: \(string)\nsender: \(senderIPAddress)\nport: \(senderPort)")
            }
            else {
                print("error in client while trying to recv()")
            }

            print("closing client")
            udpClient.close()

Here is the output I get:

Server about to recv() 1
Client sent message to server.
entering client's recv()
Server received: Hello
	sender: 127.0.0.1
	port: 20700
Server echoed, (echo server) Hello, to client:
	address: 127.0.0.1
	port: 20700
Server about to recv() 2

From the output, you can see that the recv() never returns. I'm using a UDPServer and a UDPClient in separate background threads in iOS 11.2/Xcode 9.2:

DispatchQueue.global(qos: .background).async {   
      //Code here
}

In the server code, I do this:

let(byteArray, senderIPAddress, senderPort) = udpServer.recv(1024)
...
...
let client = (address: senderIPAddress, port: senderPort)
sendMsg("(echo server) " + string, to: client)

Here is sendMsg(_:to:):

   func sendMsg(_ msg: String, to client: (address: String, port: Int) ) {
        
        //Because UDPServer has no send() method, I created a new socket to echo 
        //the message back to the client:

        let msgSender = UDPClient(address: client.address, port: Int32(client.port) )
        
        switch msgSender.send(string: msg) {
        case .success:
            print("Server echoed, \(msg), to client:\n\taddress: \(client.address)\n\tport: \(client.port)")
        case .failure(let error):
            print("Server did not echo back to client: \(error)")
        }
        
    }
    

7stud avatar Jan 10 '18 07:01 7stud

Starting UDPServer on port "127.0.0.1" never worked for me. If i use the device IP or "255.255.255.255" it works as expected..

fabrijp avatar Feb 14 '18 05:02 fabrijp