SwiftSocket
SwiftSocket copied to clipboard
UDPClient: hanging on recv()
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)")
}
}
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..