I am doing some stress test to a simple HTTP redirect server in Python scripts. The script is set up with epoll (edge trigger mode) with non-blocking sockets. But I observed something that I don't quite understand,
1) epoll can get both ECONNREFUSED and ETIMEOUT errno while the connect() is in process. Don't they both indicates the remote server can't accept the connection? How are they different, how does a client tell the difference?
2) sometimes when EPOLLIN is notified by epoll, socket.recv() returns empty string without any exception thrown (or errno in C), I can keep reading the socket without getting any exception or error, it just always returns empty string. Why is that?
Thanks,
ECONNREFUSED signals that the connection was refused by the server, while ETIMEOUT signals that the attempt to connect has timed out, i.e. that no indication (positive or negative) about the connection attempt was received from the peer.
socket.recv() returning an empty string without error is simply the EOF condition, corresponding to an empty read in C. This happens when the other side closes the connection, or shuts it down for writing. It is normal that EPOLLIN is notified when EOF occurs, because you want to know about the EOF (and because you can safely recv from the socket without it hanging).
TCP non-blocking socket.connect() and socket.recv() Error questions. (Python or C)