curl / Mailing Lists / curl-library / Single Mail
Buy commercial curl support from WolfSSL. We help you work out your issues, debug your libcurl applications, use the API, port to new platforms, add new features and more. With a team lead by the curl founder himself.

multiple rtsp connections to same host in multi interface

From: Erik Janssen via curl-library <>
Date: Mon, 4 Nov 2019 23:08:55 +0000


I use libcurl for http, plain sockets and rtsp. rtsp is a bit problematic because a transfer in rtsp context
consists of a series of steps which are each individual transfers to libcurl. At each
curl_multi_remove_handle() - curl_multi_add_handle() to get at the next rtsp step the link between
easy handle and connection is lost and re-established.

All is fine for a single easy_handle to a host but in case of multiple easy_handles to a single host (on same port)
these handles each match multiple connections and reuse happens in dynamic ways. This gives problems:

- some rtsp servers want a single session being dealt with over a single socket
  (disrespecting somewhat the rfc, but one example is gstreamer and for me that's problematic)

- The CSeq's emitted on a tcp connection go up dan down with wherever the session in-use is
instead of just increasing, which leads to numbering that is not according to the rfc.

- When TCP-interleaving the server sends its stream to a specific client port so the connection having
its socket bound to that port is supposed to handle that data and not another one.

The 2nd and 3rd item convince me a client, libcurl in this case, needs to maintain the same socket
for the link, instead of hopping from one to the other.

So, curl and rtsp are not a 100% match, and I get to the point I have to fix this or give up on it.
I studied the curl code a bit (finally) and I see two directions to try solve this.

- Decide on connection reuse not only on protocol, host and portnumber but also on rtsp session_id
  when the protocol in use is rtsp. This makes sure the correct socket is reused for the handle.
  I think the session_id can be set and cleared from the code in rtsp.c. But the connection matching
  Itself would be in the normal code path for a seldom used protocol.
  That aspect I don't like so much

- Prevent breaking the link between handle and connection, so avoid
  curl_multi_remove_handle()/curl_multi_add_handle() for proceeding to the next step of the rtsp transfer. I think of a function
  curl_multi_[restart_handle|resume_handle|resume_rtsp_handle] (name tbd) which requires that a handle is already added to the multi
 handle and it has completed, then it will restart that easy handle with the new options that have been set by the application in the meantime

To perform an rtsp transfer one needs: curl_mult_add_handle - curl_multi_restart_handle multiple times - curl_multi_remove_handle

 This would add a function to the multi interface, with a bit longer help page and without much obvious use
 outside rtsp. You can see it as polluting the multi interface and I can imagine others won't like that so much. But the normal
 execution path remains untouched and it works with other protocols as well, e.g. when a handle for http is done and the application (like mine :)) knows
there is a next request to same host pending it can issue curl_multi_restart_handle() as well, and avoid the administrative overhead of a
 full curl_multi_remove_handle/curl_multi_add_handle

Aiming for a solution with highest chance of being accepted as a patch, does one of these look good enough for general use?

Thanks for any input. I don't know libcurl on the inside too well. If you see a better way please tell me!


Received on 2019-11-05