Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: syswrite and closed sockets

by Thelonius (Priest)
on Aug 11, 2006 at 16:26 UTC ( [id://566880]=note: print w/replies, xml ) Need Help??


in reply to syswrite and closed sockets

Did the syswrite return a true value or did you just not wait long enough for it to return at all?

When you say you shut down the server, do you mean the server processs or the whole computer? If you shut down the whole computer, the time-out can take a long time--the default on Linux is somewhere between 13 and 30 minutes! (And that's assuming the two processes are on different computers. If they're on the same computer, you'll wait even longer for a reply if you shut it off :-)

On the other hand, if you just shut down the process, you should get an error "immediately".

P.S. $socket->syswrite($string, length($string)) can be shortened to $socket->syswrite($string). I seem to vaguely recall that that may not always have been the case.

Replies are listed 'Best First'.
Re^2: syswrite and closed sockets
by InfiniteLoop (Hermit) on Aug 11, 2006 at 16:56 UTC
    Actually I shutdown the server process, to which my socket was connected. Even so, the syswrite returned true, i.e the write succeeded.

     
    Here is the background: my test script opens a socket to the server and sleeps for 10 seconds, followed by a syswrite on the socket. During this 10 second window, I shutdown the server process (which takes around 3 seconds). I noticed even when the server process is not there anymore, the syswrite succeeds.

      Have the server use shutdown to make the closing of the connection be more explicit to the clients.

      I consider it a bug or design flaw that some TCP network stacks don't appear to do the equivalent of shutdown when a socket is closed, which means that the client won't know about the closure until it tries to send more data and waits a short while for the reply to that data to show up and tell it that the connection is no longer valid.

      Updates:

      See also (tye)Re: shutdown vs. close on INET sockets.

      If you don't have control over the server, then you can change your test to have the client:

      1. Open the socket to the server
      2. Wait 10 seconds while you stop the service
      3. Write to the socket hoping for failure
      4. If no failure, wait 10 more seconds
      5. Write to the socket again

      It shouldn't take very long for the response to a write to a closed socket to make it back to the client. However, if you shut off the server computer or break the network connection to it, then it may take 8 minutes before the client is willing to give up on the server.

      - tye        

        Thanks for the tip. Yes, my test script was able to detect the server shutdown, on syswrite, after 10 seconds sleep. This insight helped me build a workaround. Thanks.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://566880]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (3)
As of 2024-06-15 20:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.