diff --git a/Connector_HTTP/HTTP_Conn b/Connector_HTTP/HTTP_Conn new file mode 100755 index 00000000..e06cbc29 --- /dev/null +++ b/Connector_HTTP/HTTP_Conn @@ -0,0 +1,38 @@ +#!/bin/sh +# +# description: DDVTech HTTP Connector +# processname: Connector_HTTP + +prog="Connector_HTTP" +fullprog="/usr/bin/Connector_HTTP" +RETVAL=0 + +start() { + echo "Starting $prog" + $fullprog + return $? +} + +stop() { + echo "Stopping $prog" + killall $prog + return $? +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + RETVAL=1 +esac + +exit $RETVAL diff --git a/Connector_HTTP/Makefile b/Connector_HTTP/Makefile index c56329e5..8a0e052e 100644 --- a/Connector_HTTP/Makefile +++ b/Connector_HTTP/Makefile @@ -16,3 +16,9 @@ $(OUT): $(OBJ) $(CC) $(LIBS) -o $(OUT) $(OBJ) clean: rm -rf $(OBJ) $(OUT) Makefile.bak *~ +install: $(OUT) + -service RTMP_Conn stop + cp -f ./$(OUT) /usr/bin/ + cp -f ./HTTP_Conn /etc/init.d/ + service HTTP_Conn start + diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 4f473da0..c2e27adc 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -15,17 +15,21 @@ #include #include +enum {HANDLER_PROGRESSIVE, HANDLER_FLASH, HANDLER_APPLE, HANDLER_MICRO}; + #define DEFAULT_PORT 80 #include "../util/server_setup.cpp" #include "../util/http_parser.cpp" int mainHandler(int CONN_fd){ + int handler = HANDLER_PROGRESSIVE; bool ready4data = false;//set to true when streaming starts bool inited = false; + bool progressive_has_sent_header = false; int ss; - char streamname[200]; + std::string streamname; FLV_Pack * tag = 0; - HTTPReader HTTP_R; + HTTPReader HTTP_R, HTTP_S;//HTTP Receiver en HTTP Sender. int retval; int poller = epoll_create(1); @@ -59,6 +63,19 @@ int mainHandler(int CONN_fd){ //ERIK: bijvoorbeeld HTTP_R.GetHeader("headernaam") (voor headers) of HTTP_R.GetVar("varnaam") (voor GET/POST vars) //ERIK: of HTTP_R.method of HTTP_R.url of HTTP_R.protocol.... //ERIK: zie ook ../util/http_parser.cpp - de class definitie bovenaan zou genoeg moeten zijn voor je + //ERIK: Ik heb een handler variabele gemaakt die moet setten naar bijv HANDLER_FLASH in jouw geval. + //ERIK: Als de handler niet is geset, is hij by default PROGRESSIVE, en daarvoor heb ik de verwerking al gecode. + //ERIK: Je eigen handler instellen voorkomt dus dat mijn code hem handled alsof hij progressive is. + if (handler == HANDLER_PROGRESSIVE){ + //in het geval progressive nemen we aan dat de URL de streamname is, met .flv erachter + streamname = HTTP_R.url.substr(0, HTTP_R.url.size()-4);//strip de .flv + for (std::string::iterator i=streamname.end()-1; i>=streamname.begin(); --i){ + if (!isalpha(*i) && !isdigit(*i)){streamname.erase(i);}else{*i=tolower(*i);}//strip nonalphanumeric + } + streamname = "/tmp/shared_socket_" + streamname;//dit is dan onze shared_socket + //normaal zouden we ook een position uitlezen uit de URL, maar bij LIVE streams is dat zinloos + ready4data = true; + }//PROGRESSIVE handler printf( "URL: %s\n", HTTP_R.url.c_str()); printf( "Movie Identifier: %s\n", Movie.c_str() ); printf( "Quality Modifier: %s\n", Quality.c_str() ); @@ -100,9 +117,20 @@ int mainHandler(int CONN_fd){ if (FLV_GetPacket(tag, ss)){//able to read a full packet? //ERIK: "tag" bevat nu een FLV tag (video, audio, of metadata), de header hebben we al weggelezen, np. //ERIK: Dit is het punt waarop je eventueel data mag/kan gaan sturen en/of parsen. Leef je uit. - //ERIK: je kan een HTTPReader aanmaken en gebruiken om je HTTP request op te bouwen (via SetBody, SetHeader, etc) + //ERIK: je kan een HTTP_S gebruiken om je HTTP request op te bouwen (via SetBody, SetHeader, etc) //ERIK: en dan met de .BuildResponse("200", "OK"); call een std::string met de hele response maken, klaar voor versturen //ERIK: Note: hergebruik echter NIET de HTTP_R die ik al heb gemaakt hierboven, want er kunnen meerdere requests binnenkomen! + if (handler == HANDLER_PROGRESSIVE){ + if (!progressive_has_sent_header){ + HTTP_S.Clean();//troep opruimen die misschien aanwezig is... + HTTP_S.SetHeader("Content-Type", "video/x-flv");//FLV files hebben altijd dit content-type. + std::string tmpresp = HTTP_S.BuildResponse("200", "OK");//geen SetBody = unknown length! Dat willen we hier. + DDV_write(tmpresp.c_str(), tmpresp.size(), CONN_fd);//schrijf de HTTP response header + DDV_write(FLVHeader, 13, CONN_fd);//schrijf de FLV header, altijd 13 chars lang + progressive_has_sent_header = true; + } + DDV_write(tag->data, tag->len, CONN_fd);//schrijf deze FLV tag onbewerkt weg + }//PROGRESSIVE handler } break; } diff --git a/Connector_RAW/Makefile b/Connector_RAW/Makefile index 90349c29..fc992f72 100644 --- a/Connector_RAW/Makefile +++ b/Connector_RAW/Makefile @@ -16,3 +16,6 @@ $(OUT): $(OBJ) $(CC) $(LIBS) -o $(OUT) $(OBJ) clean: rm -rf $(OBJ) $(OUT) Makefile.bak *~ +install: $(OUT) + cp -f ./$(OUT) /usr/bin/ + diff --git a/Connector_RTMP/Makefile b/Connector_RTMP/Makefile index 65d7cf48..c74dc1aa 100644 --- a/Connector_RTMP/Makefile +++ b/Connector_RTMP/Makefile @@ -17,7 +17,7 @@ $(OUT): $(OBJ) chunkstream.cpp parsechunks.cpp handshake.cpp crypto.cpp amf.cpp clean: rm -rf $(OBJ) $(OUT) Makefile.bak *~ install: $(OUT) - -service Conn_RTMP stop + -service RTMP_Conn stop cp -f ./$(OUT) /usr/bin/ - cp -f ./Conn_RTMP /etc/init.d/ - service Conn_RTMP start + cp -f ./RTMP_Conn /etc/init.d/ + service RTMP_Conn start diff --git a/Connector_RTMP/Conn_RTMP b/Connector_RTMP/RTMP_Conn similarity index 100% rename from Connector_RTMP/Conn_RTMP rename to Connector_RTMP/RTMP_Conn diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index e7e246c0..59061e0c 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -4,7 +4,7 @@ //debugging level 3 = status information //debugging level 4 = extremely verbose status information //debugging level 5 = save all streams to FLV files -#define DEBUG 4 +#define DEBUG 3 #include #include diff --git a/Makefile b/Makefile index 2dbb804f..398f0c06 100644 --- a/Makefile +++ b/Makefile @@ -18,10 +18,11 @@ client-install: client-clean client chmod 777 /tmp/cores echo "/tmp/cores/%e.%s.%p" > /proc/sys/kernel/core_pattern service xinetd stop - cp -f ./Connector_HTTP/Connector_HTTP /usr/bin/ cd Connector_RTMP; $(MAKE) install - cp -f ./Connector_RAW/Connector_RAW /usr/bin/ + cd Connector_HTTP; $(MAKE) install + cd Connector_RAW; $(MAKE) install #cp -f ./Connector_RTSP/Connector_RTSP /usr/bin/ cp -f ./Buffer/Buffer /usr/bin/ - cp -f ./PLS /etc/xinetd.d/ + rn -rf /etc/xinetd.d/PLS service xinetd start + diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index e7b6c099..0f26d36c 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -94,7 +94,7 @@ int DDV_Accept(int sock, bool nonblock = false){ return r; } -bool DDV_write(void * buffer, int todo, int sock){ +bool DDV_write(const void * buffer, int todo, int sock){ int sofar = 0; socketBlocking = false; while (sofar != todo){