Alex Bettadapur
Alex Bettadapur

Reputation: 118

Python UDP socket throws immediate error on recvfrom()

I am trying to do some simple sockets programming in Python. I have a UDP server in Python that accepts an input and sends a response. I'm having trouble with the client code.

sock = socket.socket(
    socket.AF_INET, socket.SOCK_DGRAM
)
sock.bind(('0.0.0.0', 0))
sock.settimeout(2)
sock.sendto(json.dumps({
    'operation': operation,
    'operands': [operand1, operand2]
}), (host, port))

print sock.recvfrom(4096)

This code works perfectly when the server is running. However, when I try it without the server running, the code throws an exception immediately instead of blocking on recvfrom().

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

My desired functionality would be to timeout after some time. Can anyone explain what I am doing wrong? I use recvfrom in the server code and it blocks, so I'm a little puzzled at what the difference is.

Upvotes: 2

Views: 2663

Answers (2)

Armali
Armali

Reputation: 19395

Much of the former answer doesn't apply, since you have a SOCK_DGRAM type, i. e. UDP socket. UDP is a connectionless service, even though the error message talks about connection. The exception occurs due to a notification from the destination host in response to the sendto datagram, telling that the port is unreachable; this notification is processed (perhaps even arrives) not before you call recvfrom. There is no automatic retry; you have to try the recvfrom (maybe as well the sendto) again and implement the desired timeout yourself.

Upvotes: 1

Stephen Lin
Stephen Lin

Reputation: 4912

There are plenty possible reasons for that.

Socket error [10054] means connection reset by peer.

An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.

Check this link for details.

You need to look into it to figure out what actually happened. I don't have your environment so I cannot locate what the real problem is. Hope this helps.

Upvotes: 0

Related Questions