On Fri, 31 Dec 2010, Mykyta Dorokhin wrote:

  Now the problem. Once my inactivity timer goes off I return non-zero
  value from curl_progress_callback and curl_easy_perform returns
  CURLE_ABORTED_BY_CALLBACK code. In this case libcurl closes the
  connection, by, I assume, calling close(sock).

That is correct.

  Close() call returns
  immediately and  my retry logic algorithm proceed with additional
  attempts. If there is an unsent data in the TCP socket buffer then, as
  I understand, TCP FIN segments will not be sent immediately. Taking
  into account that TCP uses 1,2,4,8,... retransmission intervals then
  it is possible that the connection quality is acceptable already but
  the data is still not being sent for, say 16 or more seconds. It means
  that the connection will remain open on the server for quite a long
  time even though there is no need in it.

In the client too if there really was lingering data to send...

  So, I think I could take advantage of SO_LINGER socket option since it
  seems may be used to force TCP/IP stack to sent the connection reset
  state to the server immediately.

SO_LINGER changes how close() works so that it will wait until all data has been sent (or it reaches a timeout) and return info for you about it.

But when you close down the connection due to inactivity then it would be a sign that data is not sent to the peer and then I don't see how you will be able to send the data suddenly when you instead close() the connection?

  It least this can lower the number of
  stale connections on the server.

I don't understand how it would be able to do that.

  2) How can I set SO_LINGER option to the socket?

The CURLOPT_SOCKOPTFUNCTION callback is sort of designed for things like this.

  3) Is it possible to set SO_LINGER option just before closing the
  connection? Not sure if it is safe to use the options form all
  communications I have,

If you use the multi_action_* API you should be able to do that, but otherwise you can't since the exact socket in use is not easily available to applications.

--

 / daniel.haxx.se
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html

Reply via email to