summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2011-06-08 21:33:43 +0000
committerChristian Pointner <equinox@spreadspace.org>2011-06-08 21:33:43 +0000
commit640e03372fc450fbedde66b2daba2563ea652456 (patch)
tree75881e86a221e3f6724a1a7e7469c93fc68b7539
parentadded basic streamer code (diff)
added tcp server init
-rw-r--r--src/streamer.c46
-rw-r--r--src/streamer.h1
2 files changed, 44 insertions, 3 deletions
diff --git a/src/streamer.c b/src/streamer.c
index fd1223d..82cb0f4 100644
--- a/src/streamer.c
+++ b/src/streamer.c
@@ -26,10 +26,16 @@
#include <gst/gst.h>
#include <sys/types.h>
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
#include <errno.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
#include "streamer.h"
#include "datatypes.h"
@@ -56,12 +62,46 @@ static void fdremoved_cb(GstElement* sink, gint fd, gpointer data)
log_printf(INFO, "fdsink: successfully removed fd %d (sink has now %d fds)", fd, num_fds);
}
+int init_server(const char* host, const char* port)
+{
+ int server = socket(AF_INET, SOCK_STREAM, 0);
+ if(server < 0) {
+ perror("streamer: socket() call failed");
+ return -1;
+ }
+
+ // TODO: resolve host and port
+
+ struct sockaddr_in local_addr;
+ memset((char *) &local_addr, 0, sizeof(local_addr));
+ local_addr.sin_family = AF_INET;
+ local_addr.sin_port = htons(9001);
+ local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ if(bind(server, (struct sockaddr *)&local_addr, sizeof(local_addr))==-1) {
+ perror("streamer: bind() call failed");
+ return -1;
+ }
+
+ if(listen(server, 5)==-1) {
+ perror("streamer: listen() call failed");
+ return -1;
+ }
+
+ return server;
+}
+
int streamer_init(streamer_t* streamer, GMainLoop *loop, const char* host, const char* port)
{
if(!streamer)
return -1;
- // TODO: init server socket here
+ streamer->host_ = host;
+ streamer->port_ = port;
+ streamer->fd_ = init_server(host, port);
+ if(streamer->fd_ < 0) {
+ return streamer->fd_;
+ }
streamer->loop_ = loop;
streamer->sink_ = gst_element_factory_make("multifdsink", "streamer");
@@ -128,7 +168,7 @@ void streamer_stop(streamer_t* streamer)
if(!streamer)
return;
- // TODO: close server socket here
+ close(streamer->fd_);
if(streamer->thread_) {
log_printf(NOTICE, "waiting for streamer thread to stop");
diff --git a/src/streamer.h b/src/streamer.h
index 069787d..b47e252 100644
--- a/src/streamer.h
+++ b/src/streamer.h
@@ -35,6 +35,7 @@ struct streamer_struct {
GThread* thread_;
char* host_;
char* port_;
+ int fd_;
};
typedef struct streamer_struct streamer_t;