summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Krakora <rob.krakora at messagenetsystems.com>2010-08-16 12:32:28 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2010-08-16 12:45:24 +0200
commit8f6fd320654f5390d72027ac289921f1f26e40b4 (patch)
tree26b1ed73018237dd64cf20b05565a1f3a6b4a3b2
parentf2a2577f13cbba5b3089e55d60fefa53a9acd7cd (diff)
server: use SO_LINGER
SO_LINGER on the socket will make sure that any pending data on the socket is flushed ASAP and that the socket connection is reset. This makes sure that the socket can be reused immediately. Fixes 622757
-rw-r--r--gst/rtsp-server/rtsp-server.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/gst/rtsp-server/rtsp-server.c b/gst/rtsp-server/rtsp-server.c
index 7f54798..7b52ffa 100644
--- a/gst/rtsp-server/rtsp-server.c
+++ b/gst/rtsp-server/rtsp-server.c
@@ -421,6 +421,7 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
int ret, sockfd;
struct addrinfo hints;
struct addrinfo *result, *rp;
+ struct linger linger;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
@@ -476,6 +477,14 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
(void *) &ret, sizeof (ret)) < 0)
goto keepalive_failed;
+ /* make sure socket is reset immediately after close. This ensure that we can
+ * reuse the socket quickly. */
+ linger.l_onoff = 1;
+ linger.l_linger = 0;
+ if (setsockopt (server->server_sock.fd, SOL_SOCKET, SO_LINGER,
+ (void *) &linger, sizeof (linger)) < 0)
+ goto linger_failed;
+
/* set the server socket to nonblocking */
fcntl (server->server_sock.fd, F_SETFL, O_NONBLOCK);
@@ -505,29 +514,30 @@ no_socket:
}
reuse_failed:
{
- if (server->server_sock.fd >= 0) {
- close (server->server_sock.fd);
- server->server_sock.fd = -1;
- }
GST_ERROR_OBJECT (server, "failed to reuse socket: %s", g_strerror (errno));
- return FALSE;
+ goto close_error;
}
keepalive_failed:
{
- if (server->server_sock.fd >= 0) {
- close (server->server_sock.fd);
- server->server_sock.fd = -1;
- }
GST_ERROR_OBJECT (server, "failed to configure keepalive socket: %s", g_strerror (errno));
- return FALSE;
+ goto close_error;
+ }
+linger_failed:
+ {
+ GST_ERROR_OBJECT (server, "failed to no linger socket: %s", g_strerror (errno));
+ goto close_error;
}
listen_failed:
{
+ GST_ERROR_OBJECT (server, "failed to listen on socket: %s", g_strerror (errno));
+ goto close_error;
+ }
+close_error:
+ {
if (server->server_sock.fd >= 0) {
close (server->server_sock.fd);
server->server_sock.fd = -1;
}
- GST_ERROR_OBJECT (server, "failed to listen on socket: %s", g_strerror (errno));
return FALSE;
}
}