#include "config.h"
#endif
+#include <gio/gio.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#define DEFAULT_DO_RTCP TRUE
#define DEFAULT_LATENCY_MS 2000
#define DEFAULT_UDP_BUFFER_SIZE 0x80000
-#define DEFAULT_UDP_TIMEOUT 10000000
-
+#define DEFAULT_UDP_TIMEOUT 10000000
+#define DEFAULT_TCP_BACKLOG 5
/* object */
static void gst_wfd_src_set_property (GObject * object, guint prop_id,
static GstRTSPResult
gst_wfd_src_create_socket (GstWFDSrc *src, gint port)
{
- /* length of address structure */
- struct sockaddr_in my_addr;
- /* client's address */
- gint sockoptval = 1;
- int tcp_socket;
-
- /* create a TCP/IP socket */
- if ((tcp_socket = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
- GST_ERROR ("cannot create socket");
- return GST_RTSP_ERROR;
+ GSocket* tcp_socket = NULL;
+ GSocketFamily socket_family = G_SOCKET_FAMILY_IPV4;
+ GInetAddress *bind_addr = NULL;
+ GSocketAddress *bind_saddr = NULL;
+ GError *error = NULL;
+
+ tcp_socket = g_socket_new (socket_family, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error);
+ if (tcp_socket == NULL) {
+ GST_ERROR ("socket creation is failed [%s]", error->message);
+ goto failed;
}
- /* allow immediate reuse of the port */
- setsockopt (tcp_socket, SOL_SOCKET, SO_REUSEADDR, &sockoptval, sizeof(int));
- /* bind the socket to our source address */
- memset ((char*)&my_addr, 0, sizeof(my_addr));
- /* 0 out the structure */
- my_addr.sin_family = AF_INET;
- /* address family */
- my_addr.sin_port = htons (port);
- if (bind (tcp_socket, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) {
- GST_ERROR ("cannot bind socket");
- close (tcp_socket);
- return GST_RTSP_ERROR;
+
+ GST_DEBUG_OBJECT (src, "got socket %p", tcp_socket);
+
+ if (!g_socket_set_option (tcp_socket, SOL_SOCKET, SO_REUSEADDR, TRUE, &error)) {
+ GST_ERROR ("cannot set socket option. [%s]", error->message);
+ goto failed;
}
- /* set the socket for listening (queue backlog of 5) */
- if (listen(tcp_socket, 5) < 0) {
- close (tcp_socket);
- GST_ERROR ("error while listening socket");
- return GST_RTSP_ERROR;
+
+ bind_addr = g_inet_address_new_any (socket_family);
+ if (!bind_addr){
+ GST_ERROR ("get bind_addr failed.");
+ goto failed;
}
- src->tcp = g_socket_new_from_fd(tcp_socket, NULL);
+ bind_saddr = g_inet_socket_address_new (bind_addr, port);
+ if (!bind_saddr){
+ GST_ERROR ("get bind_saddr failed.");
+ goto failed;
+ }
+ if (!g_socket_bind (tcp_socket, bind_saddr, TRUE, &error)){
+ GST_ERROR ("bind failed [%s]", error->message);
+ goto failed;
+ }
+
+ g_socket_set_listen_backlog (tcp_socket, DEFAULT_TCP_BACKLOG);
+ if (!g_socket_listen (tcp_socket, &error)){
+ GST_ERROR ("cannot listen socket [%s]", error->message);
+ goto failed;
+ }
+ src->tcp = tcp_socket;
+
+ g_object_unref (bind_addr);
+ g_object_unref (bind_saddr);
return GST_RTSP_OK;
+
+failed:
+ {
+ g_object_unref (bind_addr);
+ g_object_unref (bind_saddr);
+ g_object_unref (tcp_socket);
+
+ return GST_RTSP_ERROR;
+ }
}
static GstRTSPResult