Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing on a TCP socket closed by the peer

I have a client-server application where each side communicate with the other via TCP socket.

I properly establish the connection and then I crash the server BEFORE any data is written on the socket by the client.
What I see is that the first write() attempt (client-side) is successful and it returns the actual number of written bytes, while the following ones return (as I expected) -1 (receiving a SIGPIPE) and errno=EPIPE.

Why the first write() is successful even if the socket is already closed?

EDIT Sometimes also the following write() have a positive return values, as if everything goes well.

like image 296
JustTrying Avatar asked Mar 14 '13 09:03

JustTrying


People also ask

What does Connection closed by peer mean?

This means that a TCP RST was received and the connection is now closed. This occurs when a packet is sent from your end of the connection but the other end does not recognize the connection; it will send back a packet with the RST bit set in order to forcibly close the connection.

What causes Connection closed by peer?

The error message "Connection reset by peer" appears, if the web services client was waiting for a SOAP response from the remote web services provider and the connection was closed prematurely. One of the most common causes for this error is a firewall in the middle closing the connection.

How can we detect that a TCP socket is closed by the remote peer in AC socket program?

You could check if the socket is still connected by trying to write to the file descriptor for each socket. Then if the return value of the write is -1 or if errno = EPIPE, you know that socket has been closed.


1 Answers

You're confused by what the return value of write() means. It doesn't mean, "the peer got the data and acknowledged it". Instead, it means, "I buffered so-many bytes to send to the peer and they're my responsibility now, so you can forget about them (and I don't have any pending errors)".

That is, if the TCP stack accepts the write and returns n bytes, that doesn't mean they've been written yet, just queued for writing. It'll take some time, perhaps 30s after it starts sending network traffic, before the stack gives up and returns an error to you. During that time, you could have done several calls to write() which were successful at queueing data for sending. (The write error will be returned in c.30s if the peer has vanished, or immediately if the peer can be contacted and sends a RST packet straight away to indicate the connection is dead.)

like image 156
Nicholas Wilson Avatar answered Oct 10 '22 17:10

Nicholas Wilson