diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c
index 484f2c4..9f581a4 100644
--- a/gst-libs/gst/rtsp/gstrtspconnection.c
+++ b/gst-libs/gst/rtsp/gstrtspconnection.c
@@ -1444,6 +1444,75 @@ gst_rtsp_connection_write (GstRTSPConnection * conn, const guint8 * data,
   return res;
 }
 
+/**
+ * gst_rtsp_connection_write_vectors:
+ * @conn: a #GstRTSPConnection
+ * @vecs: the vectors to write
+ * @num_vecs: the number of @vecs
+ *
+ * Attempt to write @num_vecs number of @vecs to the connected @conn,
+ * without blocking.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_write_vectors (GstRTSPConnection * conn,
+    GOutputVector * vecs, guint num_vecs)
+{
+  GError *err = NULL;
+  guint i = 0;
+  guint send_len;
+  gssize num_written = 0;
+  GSocket *socket;
+  gboolean eagain_err = FALSE;
+
+  g_return_val_if_fail (vecs != NULL, GST_RTSP_EINVAL);
+
+  socket = gst_rtsp_connection_get_write_socket (conn);
+  if (socket == NULL) {
+    GST_DEBUG ("failed to retrieve write socket from connection %p", conn);
+    return GST_RTSP_ERROR;
+  }
+
+  while (i < num_vecs) {
+    send_len = MIN (num_vecs - i, UIO_MAXIOV);
+
+    do {
+      eagain_err = FALSE;
+      g_socket_set_blocking (socket, FALSE);
+      num_written =
+        g_socket_send_message (socket, NULL, &vecs[i], send_len, NULL, 0,
+            G_SOCKET_MSG_NONE, NULL, &err);
+      g_socket_set_blocking (socket, TRUE);
+
+      if ((num_written == -1) && g_error_matches (err, G_IO_ERROR,
+            G_IO_ERROR_WOULD_BLOCK)) {
+        eagain_err = TRUE;
+        g_clear_error (&err);
+      }
+
+    } while (eagain_err);
+
+    if (num_written == -1) {
+      GST_DEBUG ("%s", err->message);
+      g_clear_error (&err);
+      return GST_RTSP_ERROR;
+    }
+    /* recalculate to deal with partial writes */
+    while (num_written > 0) {
+      if (num_written < vecs[i].size) {
+        vecs[i].buffer = (gchar *) vecs[i].buffer + num_written;
+        vecs[i].size -= num_written;
+        num_written = 0;
+      } else {
+        num_written -= vecs[i].size;
+        ++i;
+      }
+    }
+  }
+  return GST_RTSP_OK;
+}
+
 static GString *
 message_to_string (GstRTSPConnection * conn, GstRTSPMessage * message)
 {
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.h b/gst-libs/gst/rtsp/gstrtspconnection.h
index 11e0ac8..940b788 100644
--- a/gst-libs/gst/rtsp/gstrtspconnection.h
+++ b/gst-libs/gst/rtsp/gstrtspconnection.h
@@ -129,7 +129,11 @@ GstRTSPResult      gst_rtsp_connection_send           (GstRTSPConnection *conn,
 GST_EXPORT
 GstRTSPResult      gst_rtsp_connection_receive        (GstRTSPConnection *conn, GstRTSPMessage *message,
                                                        GTimeVal *timeout);
+/* sending messages on the connection write socket without blocking */
 
+GST_EXPORT
+GstRTSPResult      gst_rtsp_connection_write_vectors  (GstRTSPConnection * conn, GOutputVector * vecs,
+                                                       guint num_vecs);
 /* status management */
 
 GST_EXPORT
