From de701fc58ee7d8440f48a3514cb27181229bff75 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 6 Nov 2010 16:38:19 +0100 Subject: [PATCH 01/60] Buffer conn timeout fix --- Buffer/main.cpp | 4 +++- Makefile | 2 +- PLS | 20 +++++++++++++------- util/flv.cpp | 7 ++++--- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index fb078177..2812df88 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -55,7 +55,9 @@ int main( int argc, char * argv[] ) { //new FLV file, read the file header again. FLV_Readheader(); } else { - FLV_GetPacket(ringbuf[current_buffer]->FLV); + if (!FLV_GetPacket(ringbuf[current_buffer]->FLV)){ + break;//wrong packet? something bust be broken. End program! + } packtype = ringbuf[current_buffer]->FLV->data[0]; //store metadata, if available if (packtype == 0x12){ diff --git a/Makefile b/Makefile index cceed8f6..8d83b685 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ client-clean: #cd Connector_RTSP; $(MAKE) clean cd Buffer; $(MAKE) clean clean: client-clean -client-install: client +client-install: client-clean client cp -f ./Connector_HTTP/Connector_HTTP /usr/bin/ cp -f ./Connector_RTMP/Connector_RTMP /usr/bin/ cp -f ./Connector_RAW/Connector_RAW /usr/bin/ diff --git a/PLS b/PLS index c4546aa2..d041a879 100644 --- a/PLS +++ b/PLS @@ -8,6 +8,8 @@ service ddvtechhttp server = /usr/bin/Connector_HTTP port = 7337 wait = no + per_source = 10 + cps = 100 5 } service ddvtechrtmp @@ -20,17 +22,21 @@ service ddvtechrtmp server = /usr/bin/Connector_RTMP port = 1935 wait = no + per_source = 10 + cps = 100 5 } service ddvtechraw { - disable = no - type = UNLISTED + disable = no + type = UNLISTED protocol = tcp - socket_type = stream - user = root - server = /usr/bin/Connector_RAW - port = 3773 - wait = no + socket_type = stream + user = root + server = /usr/bin/Connector_RAW + port = 3773 + wait = no + per_source = 10 + cps = 100 5 } diff --git a/util/flv.cpp b/util/flv.cpp index 0e119a52..0c922506 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -35,15 +35,16 @@ bool FLV_Readheader(){ //will assign pointer if null //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) -void FLV_GetPacket(FLV_Pack *& p){ +bool FLV_GetPacket(FLV_Pack *& p){ if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} - fread(p->data,1,11,stdin); + if (fread(p->data,1,11,stdin) != 11){return false;} p->len = p->data[3] + 15; p->len += (p->data[2] << 8); p->len += (p->data[1] << 16); if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} - fread(p->data+11,1,p->len-11,stdin); + if (fread(p->data+11,1,p->len-11,stdin) != (unsigned int)(p->len-11)){return false;} p->isKeyframe = false; if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + return true; }//FLV_GetPacket From 82d5ed69a2b610fc2d85192fa6de2813e93a13d7 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 14:49:45 +0100 Subject: [PATCH 02/60] Gearbox updates, FLV parser rewrite, buffer fixes... --- Buffer/main.cpp | 68 +++++++++++++++++++----------------- util/flv.cpp | 93 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 102 insertions(+), 59 deletions(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index 2812df88..1fb22786 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include "../sockets/SocketW.h" #include @@ -47,17 +49,17 @@ int main( int argc, char * argv[] ) { unsigned char packtype; bool gotVideoInfo = false; bool gotAudioInfo = false; - while(std::cin.good() && std::cout.good()) { - loopcount ++; + + //set stdin to be nonblocking + int flags = fcntl(0, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(0, F_SETFL, flags); + + while(!feof(stdin) && !ferror(stdin) && !All_Hell_Broke_Loose){ //invalidate the current buffer ringbuf[current_buffer]->number = -1; - if (std::cin.peek() == 'F') { - //new FLV file, read the file header again. - FLV_Readheader(); - } else { - if (!FLV_GetPacket(ringbuf[current_buffer]->FLV)){ - break;//wrong packet? something bust be broken. End program! - } + if (FLV_GetPacket(ringbuf[current_buffer]->FLV)){ + loopcount ++; packtype = ringbuf[current_buffer]->FLV->data[0]; //store metadata, if available if (packtype == 0x12){ @@ -98,35 +100,39 @@ int main( int argc, char * argv[] ) { if (packtype == 0x09){ if (((ringbuf[current_buffer]->FLV->data[11] & 0xf0) >> 4) == 1){lastproper = current_buffer;} } - incoming = listener.accept(&BError); - if (incoming){ - connectionList.push_back(user(incoming)); - //send the FLV header - connectionList.back().MyBuffer = lastproper; - connectionList.back().MyBuffer_num = -1; - //TODO: Do this more nicely? - if (connectionList.back().Conn->send(FLVHeader,13,&BError) != 13){ - connectionList.back().disconnect("failed to receive the header!"); - }else{ - if (connectionList.back().Conn->send(metabuffer,metabuflen,&BError) != metabuflen){ - connectionList.back().disconnect("failed to receive metadata!"); - } - } - if (BError != SWBaseSocket::ok){ - connectionList.back().disconnect("Socket error: " + BError.get_error()); + //keep track of buffers + current_buffer++; + current_buffer %= buffers; + ringbuf[current_buffer]->number = loopcount; + } + + //check for new connections, accept them if there are any + incoming = listener.accept(&BError); + if (incoming){ + connectionList.push_back(user(incoming)); + //send the FLV header + connectionList.back().MyBuffer = lastproper; + connectionList.back().MyBuffer_num = -1; + //TODO: Do this more nicely? + if (connectionList.back().Conn->send(FLVHeader,13,&BError) != 13){ + connectionList.back().disconnect("failed to receive the header!"); + }else{ + if (connectionList.back().Conn->send(metabuffer,metabuflen,&BError) != metabuflen){ + connectionList.back().disconnect("failed to receive metadata!"); } } - ringbuf[current_buffer]->number = loopcount; - //send all connections what they need, if and when they need it + if (BError != SWBaseSocket::ok){ + connectionList.back().disconnect("Socket error: " + BError.get_error()); + } + } + //send all connections what they need, if and when they need it + if (connectionList.size() > 0){ for (connIt = connectionList.begin(); connIt != connectionList.end(); connIt++){ if (!(*connIt).is_connected){connectionList.erase(connIt);break;} (*connIt).Send(ringbuf, buffers); } - //keep track of buffers - current_buffer++; - current_buffer %= buffers; } - } + }//main loop // disconnect listener std::cout << "Reached EOF of input" << std::endl; diff --git a/util/flv.cpp b/util/flv.cpp index 0c922506..e7048dcb 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -8,43 +8,80 @@ struct FLV_Pack { };//FLV_Pack char FLVHeader[13]; +bool All_Hell_Broke_Loose = false; -//reads full length from a file descriptor -void Magic_Read(char * buf, int len, int file){ - int i = 0; - while (i < len) i += read(file, buf, len-i); -} - - -//reads a FLV header and checks for correctness +//checks FLV Header for correctness //returns true if everything is alright, false otherwise -bool FLV_Readheader(){ - fread(FLVHeader,1,13,stdin); - if (FLVHeader[0] != 'F') return false; - if (FLVHeader[1] != 'L') return false; - if (FLVHeader[2] != 'V') return false; - if (FLVHeader[8] != 0x09) return false; - if (FLVHeader[9] != 0) return false; - if (FLVHeader[10] != 0) return false; - if (FLVHeader[11] != 0) return false; - if (FLVHeader[12] != 0) return false; +bool FLV_Checkheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + if (header[8] != 0x09) return false; + if (header[9] != 0) return false; + if (header[10] != 0) return false; + if (header[11] != 0) return false; + if (header[12] != 0) return false; return true; -}//FLV_Readheader +}//FLV_Checkheader + +//returns true if header is an FLV header +bool FLV_Isheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + return true; +}//FLV_Isheader + +bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar){ + if (sofar >= count){return true;} + int r = 0; + r = fread(buffer + sofar,1,count-sofar,stdin); + if (r < 0){All_Hell_Broke_Loose = true; return false;} + sofar += r; + if (sofar >= count){return true;} + return false; +} //gets a packet, storing in given FLV_Pack pointer. //will assign pointer if null //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) bool FLV_GetPacket(FLV_Pack *& p){ + static bool done = true; + static unsigned int sofar = 0; if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} - if (fread(p->data,1,11,stdin) != 11){return false;} - p->len = p->data[3] + 15; - p->len += (p->data[2] << 8); - p->len += (p->data[1] << 16); - if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} - if (fread(p->data+11,1,p->len-11,stdin) != (unsigned int)(p->len-11)){return false;} - p->isKeyframe = false; - if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} - return true; + + if (done){ + //read a header + if (ReadUntil(p->data, 11, sofar)){ + //if its a correct FLV header, throw away and read tag header + if (FLV_Isheader(p->data)){ + if (ReadUntil(p->data, 13, sofar)){ + if (FLV_Checkheader(p->data)){ + sofar = 0; + memcpy(FLVHeader, p->data, 13); + }else{All_Hell_Broke_Loose = true;} + } + }else{ + //if a tag header, calculate length and read tag body + p->len = p->data[3] + 15; + p->len += (p->data[2] << 8); + p->len += (p->data[1] << 16); + if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} + done = false; + } + } + }else{ + //read tag body + if (ReadUntil(p->data, p->len, sofar)){ + //calculate keyframeness, next time read header again, return true + p->isKeyframe = false; + if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + done = true; + return true; + } + } + return false; }//FLV_GetPacket + From 92f9931fdc4ef634cab85dedcb33c448dace5354 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 15:03:46 +0100 Subject: [PATCH 03/60] Oeps --- util/flv.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/util/flv.cpp b/util/flv.cpp index e7048dcb..44185ffd 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -79,6 +79,7 @@ bool FLV_GetPacket(FLV_Pack *& p){ p->isKeyframe = false; if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} done = true; + sofar = 0; return true; } } From f4c7f187a75ac4a4a81813c7de1a92501f3433dc Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 15:09:31 +0100 Subject: [PATCH 04/60] Iets beter, hopelijk... --- Buffer/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index 1fb22786..72db66b3 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -55,7 +55,7 @@ int main( int argc, char * argv[] ) { flags |= O_NONBLOCK; fcntl(0, F_SETFL, flags); - while(!feof(stdin) && !ferror(stdin) && !All_Hell_Broke_Loose){ + while(!feof(stdin) && !All_Hell_Broke_Loose){ //invalidate the current buffer ringbuf[current_buffer]->number = -1; if (FLV_GetPacket(ringbuf[current_buffer]->FLV)){ From f16aa16a66a7dc4ed7415c8d88b24b19a209fd0c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 15:24:18 +0100 Subject: [PATCH 05/60] Nog wat fixes --- Connector_RTMP/main.cpp | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 14cfea45..2ee622eb 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -57,7 +57,7 @@ int main(){ //select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed //FD_ISSET(0, &pollset) || //NOTE: Polling does not work? WHY?!? WHY DAMN IT?!? - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){fflush(stdout);parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! diff --git a/Makefile b/Makefile index 8d83b685..8f14fb4b 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ client-local-install: client mkdir -p ./bin cp -f ./Connector_HTTP/Connector_HTTP ./bin/ cp -f ./Connector_RTMP/Connector_RTMP ./bin/ - cp -f ./Connector_RTMP/Connector_RAW ./bin/ + cp -f ./Connector_RAW/Connector_RAW ./bin/ #cp -f ./Connector_RTSP/Connector_RTSP ./bin/ cp -f ./Buffer/Buffer ./bin/ From 86ebaa9b043c0f89962f1b30a4837ebad8b12da0 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 15:41:57 +0100 Subject: [PATCH 06/60] Polling support voor RTMP connector --- Connector_RTMP/main.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 2ee622eb..e267f289 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -11,6 +11,9 @@ #include #include +//needed for poll +#include + //for connection to server #include "../sockets/SocketW.h" bool ready4data = false;//set to true when streaming starts @@ -27,12 +30,16 @@ int main(){ unsigned int fts = 0; unsigned int ftst; SWUnixSocket ss; - fd_set pollset; - struct timeval timeout; + //fd_set pollset; + //struct timeval timeout; //0 timeout - return immediately after select call - timeout.tv_sec = 1; timeout.tv_usec = 0; - FD_ZERO(&pollset);//clear the polling set - FD_SET(0, &pollset);//add stdin to polling set + //timeout.tv_sec = 1; timeout.tv_usec = 0; + //FD_ZERO(&pollset);//clear the polling set + //FD_SET(0, &pollset);//add stdin to polling set + + pollfd cinfd[1]; + cinfd[0].fd = fileno(stdin); + cinfd[0].events = POLLIN; //first timestamp set firsttime = getNowMS(); @@ -57,7 +64,8 @@ int main(){ //select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed //FD_ISSET(0, &pollset) || //NOTE: Polling does not work? WHY?!? WHY DAMN IT?!? - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){fflush(stdout);parseChunk();fflush(stdout);} + //if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){fflush(stdout);parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 100)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From b11bfd7ea09fafd91591b400adc4672cb47c9310 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 16:57:27 +0100 Subject: [PATCH 07/60] Select poging nummer 1 --- Connector_RTMP/main.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index e267f289..d0465e2d 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -12,7 +12,7 @@ #include //needed for poll -#include +//#include //for connection to server #include "../sockets/SocketW.h" @@ -30,16 +30,15 @@ int main(){ unsigned int fts = 0; unsigned int ftst; SWUnixSocket ss; - //fd_set pollset; - //struct timeval timeout; - //0 timeout - return immediately after select call - //timeout.tv_sec = 1; timeout.tv_usec = 0; - //FD_ZERO(&pollset);//clear the polling set - //FD_SET(0, &pollset);//add stdin to polling set - pollfd cinfd[1]; - cinfd[0].fd = fileno(stdin); - cinfd[0].events = POLLIN; + fd_set pollset; + struct timeval timeout; + //0 timeout - return immediately after select call + timeout.tv_sec = 1; timeout.tv_usec = 0; + + //pollfd cinfd[1]; + //cinfd[0].fd = fileno(stdin); + //cinfd[0].events = POLLIN; //first timestamp set firsttime = getNowMS(); @@ -61,11 +60,11 @@ int main(){ fprintf(stderr, "Starting processing...\n"); #endif while (std::cin.good() && std::cout.good()){ - //select(1, &pollset, 0, 0, &timeout); + FD_ZERO(&pollset);//clear the polling set + FD_SET(fileno(stdin), &pollset);//add stdin to polling set + select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed - //FD_ISSET(0, &pollset) || //NOTE: Polling does not work? WHY?!? WHY DAMN IT?!? - //if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){fflush(stdout);parseChunk();fflush(stdout);} - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 100)){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && FD_ISSET(0, &pollset)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From de6a80253b1f485000dda0727391574098313a26 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 17:06:54 +0100 Subject: [PATCH 08/60] Select poging nummer 2 --- Connector_RTMP/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index d0465e2d..915fc6aa 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -33,8 +33,6 @@ int main(){ fd_set pollset; struct timeval timeout; - //0 timeout - return immediately after select call - timeout.tv_sec = 1; timeout.tv_usec = 0; //pollfd cinfd[1]; //cinfd[0].fd = fileno(stdin); @@ -62,6 +60,7 @@ int main(){ while (std::cin.good() && std::cout.good()){ FD_ZERO(&pollset);//clear the polling set FD_SET(fileno(stdin), &pollset);//add stdin to polling set + timeout.tv_sec = 1; timeout.tv_usec = 0; select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && FD_ISSET(0, &pollset)){parseChunk();fflush(stdout);} From 5c3ddab6570aec4f3cd3ce585a05dde9dd77dd90 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 17:32:23 +0100 Subject: [PATCH 09/60] Polling poging 1 --- Connector_RTMP/main.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 915fc6aa..c001d0aa 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -12,7 +12,7 @@ #include //needed for poll -//#include +#include //for connection to server #include "../sockets/SocketW.h" @@ -34,9 +34,9 @@ int main(){ fd_set pollset; struct timeval timeout; - //pollfd cinfd[1]; - //cinfd[0].fd = fileno(stdin); - //cinfd[0].events = POLLIN; + pollfd cinfd[1]; + cinfd[0].fd = fileno(stdin); + cinfd[0].events = POLLIN; //first timestamp set firsttime = getNowMS(); @@ -57,13 +57,14 @@ int main(){ #ifdef DEBUG fprintf(stderr, "Starting processing...\n"); #endif + int infile = fileno(stdin); while (std::cin.good() && std::cout.good()){ - FD_ZERO(&pollset);//clear the polling set - FD_SET(fileno(stdin), &pollset);//add stdin to polling set timeout.tv_sec = 1; timeout.tv_usec = 0; + FD_ZERO(&pollset);//clear the polling set + FD_SET(infile, &pollset);//add stdin to polling set select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && FD_ISSET(0, &pollset)){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 500)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From 21ede42d8d4c66ee4fa71dbee5d81d819b43186e Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 17:38:47 +0100 Subject: [PATCH 10/60] Polling poging 2 --- Connector_RTMP/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index c001d0aa..7b0e8aba 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -64,7 +64,7 @@ int main(){ FD_SET(infile, &pollset);//add stdin to polling set select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 500)){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, (signed int)500)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From 8c0f42c6e7072af79ef8a0efea01acde39c1c0b6 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 17:40:37 +0100 Subject: [PATCH 11/60] Polling poging 3 --- Connector_RTMP/main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 7b0e8aba..76cfa3bb 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -59,10 +59,6 @@ int main(){ #endif int infile = fileno(stdin); while (std::cin.good() && std::cout.good()){ - timeout.tv_sec = 1; timeout.tv_usec = 0; - FD_ZERO(&pollset);//clear the polling set - FD_SET(infile, &pollset);//add stdin to polling set - select(1, &pollset, 0, 0, &timeout); //only parse input from stdin if available or not yet init'ed if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, (signed int)500)){parseChunk();fflush(stdout);} if (ready4data){ From f71a51cc1b4ef90eee12eb5e7d55347c10fbdd21 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 17:50:25 +0100 Subject: [PATCH 12/60] Polling poging 4 --- Connector_RTMP/main.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 76cfa3bb..e59a2cd6 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -31,9 +31,6 @@ int main(){ unsigned int ftst; SWUnixSocket ss; - fd_set pollset; - struct timeval timeout; - pollfd cinfd[1]; cinfd[0].fd = fileno(stdin); cinfd[0].events = POLLIN; @@ -58,9 +55,9 @@ int main(){ fprintf(stderr, "Starting processing...\n"); #endif int infile = fileno(stdin); - while (std::cin.good() && std::cout.good()){ + while (!ferror(stdin) && !ferror(stdout)){ //only parse input from stdin if available or not yet init'ed - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, (signed int)500)){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 100)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From adf644445d851889d61e8de5c9a9afc4ea80be6c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 20:25:27 +0100 Subject: [PATCH 13/60] EPolling poging 1 --- Connector_RTMP/main.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index e59a2cd6..f8de6861 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -4,15 +4,8 @@ #include #include -//needed for select -#include -#include -#include -#include -#include - -//needed for poll -#include +//needed for epoll +#include //for connection to server #include "../sockets/SocketW.h" @@ -31,10 +24,13 @@ int main(){ unsigned int ftst; SWUnixSocket ss; - pollfd cinfd[1]; - cinfd[0].fd = fileno(stdin); - cinfd[0].events = POLLIN; - + int poller = epoll_create(1); + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP; + ev.data.fd = fileno(stdin); + epoll_ctl(poller, EPOLL_CTL_ADD, fileno(stdin), &ev); + struct epoll_event events[1]; + //first timestamp set firsttime = getNowMS(); @@ -54,10 +50,9 @@ int main(){ #ifdef DEBUG fprintf(stderr, "Starting processing...\n"); #endif - int infile = fileno(stdin); while (!ferror(stdin) && !ferror(stdout)){ //only parse input from stdin if available or not yet init'ed - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && poll(cinfd, 1, 100)){parseChunk();fflush(stdout);} + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (epoll_wait(poller, events, 1, 100) > 0)){parseChunk();fflush(stdout);} if (ready4data){ if (!inited){ //we are ready, connect the socket! From 1d33319e4dea6f3a98b0605ed4fbbd1b797edb6d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 21:22:08 +0100 Subject: [PATCH 14/60] geen polling meer - poging 1 --- Connector_RTMP/main.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index f8de6861..1ae5d360 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -4,9 +4,6 @@ #include #include -//needed for epoll -#include - //for connection to server #include "../sockets/SocketW.h" bool ready4data = false;//set to true when streaming starts @@ -24,15 +21,10 @@ int main(){ unsigned int ftst; SWUnixSocket ss; - int poller = epoll_create(1); - struct epoll_event ev; - ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP; - ev.data.fd = fileno(stdin); - epoll_ctl(poller, EPOLL_CTL_ADD, fileno(stdin), &ev); - struct epoll_event events[1]; - //first timestamp set firsttime = getNowMS(); + int lastcheck = getNowMS(); + int rightnow = 0; #ifdef DEBUG fprintf(stderr, "Doing handshake...\n"); @@ -52,7 +44,12 @@ int main(){ #endif while (!ferror(stdin) && !ferror(stdout)){ //only parse input from stdin if available or not yet init'ed - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (epoll_wait(poller, events, 1, 100) > 0)){parseChunk();fflush(stdout);} + rightnow = getNowMS(); + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (rightnow - lastcheck > 100)){ + lastcheck = rightnow; + parseChunk(); + fflush(stdout); + } if (ready4data){ if (!inited){ //we are ready, connect the socket! From ea588b0791cbee15d408fb65b3aa24217d274998 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 21:41:57 +0100 Subject: [PATCH 15/60] Buffer met eerste poging epoll support --- Buffer/main.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index 72db66b3..e60cc7ac 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -11,6 +11,8 @@ #include "../util/flv.cpp" //FLV format parser #include "user.cpp" +#include + int get_empty( user ** list, int amount ) { for (int i = 0; i < amount; i++ ){ if (!list[i]->is_connected){return i;} @@ -51,14 +53,23 @@ int main( int argc, char * argv[] ) { bool gotAudioInfo = false; //set stdin to be nonblocking - int flags = fcntl(0, F_GETFL, 0); - flags |= O_NONBLOCK; - fcntl(0, F_SETFL, flags); + //int flags = fcntl(0, F_GETFL, 0); + //flags |= O_NONBLOCK; + //fcntl(0, F_SETFL, flags); + + int infile = fileno(stdin); + int poller = epoll_create(1); + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP; + ev.data.fd = infile; + epoll_ctl(poller, EPOLL_CTL_ADD, infile, &ev); + struct epoll_event events[1]; + while(!feof(stdin) && !All_Hell_Broke_Loose){ //invalidate the current buffer ringbuf[current_buffer]->number = -1; - if (FLV_GetPacket(ringbuf[current_buffer]->FLV)){ + if ((epoll_wait(poller, events, 1, 100) > 0) && FLV_GetPacket(ringbuf[current_buffer]->FLV)){ loopcount ++; packtype = ringbuf[current_buffer]->FLV->data[0]; //store metadata, if available From d9fd90e36fab42f594d5bc72551916d722a2ced4 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 21:50:15 +0100 Subject: [PATCH 16/60] RTMP connector teller approach --- Connector_RTMP/main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 1ae5d360..7f159c5e 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -23,8 +23,7 @@ int main(){ //first timestamp set firsttime = getNowMS(); - int lastcheck = getNowMS(); - int rightnow = 0; + int teller = 0; #ifdef DEBUG fprintf(stderr, "Doing handshake...\n"); @@ -44,9 +43,10 @@ int main(){ #endif while (!ferror(stdin) && !ferror(stdout)){ //only parse input from stdin if available or not yet init'ed - rightnow = getNowMS(); - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (rightnow - lastcheck > 100)){ - lastcheck = rightnow; + //rightnow = getNowMS(); + teller++; + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (teller > 15)){ + teller = 0; parseChunk(); fflush(stdout); } From 931bbcced1e64725c1db2a35462850dd3be6bb41 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 21:55:43 +0100 Subject: [PATCH 17/60] RTMP connector ouderwetse approach --- Connector_RTMP/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 7f159c5e..5d3298ee 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -44,9 +44,7 @@ int main(){ while (!ferror(stdin) && !ferror(stdout)){ //only parse input from stdin if available or not yet init'ed //rightnow = getNowMS(); - teller++; - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && (teller > 15)){ - teller = 0; + if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){ parseChunk(); fflush(stdout); } From e04bb3efde8fad4d3726a2be1c872f4e6bd9e8ef Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 22:48:05 +0100 Subject: [PATCH 18/60] First version of standalone RTMP connector --- Connector_RTMP/chunkstream.cpp | 124 ++++++++++++++++----------------- Connector_RTMP/handshake.cpp | 44 ++++++------ Connector_RTMP/main.cpp | 20 ++++++ util/ddv_socket.cpp | 41 +++++++++++ 4 files changed, 145 insertions(+), 84 deletions(-) create mode 100644 util/ddv_socket.cpp diff --git a/Connector_RTMP/chunkstream.cpp b/Connector_RTMP/chunkstream.cpp index 9d9247aa..f097098e 100644 --- a/Connector_RTMP/chunkstream.cpp +++ b/Connector_RTMP/chunkstream.cpp @@ -108,18 +108,18 @@ void SendChunk(chunkpack ch){ } } if (ch.cs_id <= 63){ - tmp = chtype | ch.cs_id; fwrite(&tmp, 1, 1, stdout); + tmp = chtype | ch.cs_id; fwrite(&tmp, 1, 1, CONN); snd_cnt+=1; }else{ if (ch.cs_id <= 255+64){ - tmp = chtype | 0; fwrite(&tmp, 1, 1, stdout); - tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, stdout); + tmp = chtype | 0; fwrite(&tmp, 1, 1, CONN); + tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, CONN); snd_cnt+=2; }else{ - tmp = chtype | 1; fwrite(&tmp, 1, 1, stdout); + tmp = chtype | 1; fwrite(&tmp, 1, 1, CONN); tmpi = ch.cs_id - 64; - tmp = tmpi % 256; fwrite(&tmp, 1, 1, stdout); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, stdout); + tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=3; } } @@ -129,67 +129,67 @@ void SendChunk(chunkpack ch){ if (chtype == 0x00){ tmpi = ch.timestamp; if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;} - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, stdout); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, stdout); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, stdout); + tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=3; }else{ tmpi = ch.timestamp - prev.timestamp; if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;} - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, stdout); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, stdout); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, stdout); + tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=3; } if (chtype != 0x80){ //len tmpi = ch.len; - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, stdout); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, stdout); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, stdout); + tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=3; //msg type id - tmp = ch.msg_type_id; fwrite(&tmp, 1, 1, stdout); + tmp = ch.msg_type_id; fwrite(&tmp, 1, 1, CONN); snd_cnt+=1; if (chtype != 0x40){ //msg stream id - tmp = ch.msg_stream_id % 256; fwrite(&tmp, 1, 1, stdout); - tmp = ch.msg_stream_id / 256; fwrite(&tmp, 1, 1, stdout); - tmp = ch.msg_stream_id / (256*256); fwrite(&tmp, 1, 1, stdout); - tmp = ch.msg_stream_id / (256*256*256); fwrite(&tmp, 1, 1, stdout); + tmp = ch.msg_stream_id % 256; fwrite(&tmp, 1, 1, CONN); + tmp = ch.msg_stream_id / 256; fwrite(&tmp, 1, 1, CONN); + tmp = ch.msg_stream_id / (256*256); fwrite(&tmp, 1, 1, CONN); + tmp = ch.msg_stream_id / (256*256*256); fwrite(&tmp, 1, 1, CONN); snd_cnt+=4; } } } //support for 0x00ffffff timestamps if (ntime){ - tmp = ntime / (256*256*256); fwrite(&tmp, 1, 1, stdout); - tmp = ntime / (256*256); fwrite(&tmp, 1, 1, stdout); - tmp = ntime / 256; fwrite(&tmp, 1, 1, stdout); - tmp = ntime % 256; fwrite(&tmp, 1, 1, stdout); + tmp = ntime / (256*256*256); fwrite(&tmp, 1, 1, CONN); + tmp = ntime / (256*256); fwrite(&tmp, 1, 1, CONN); + tmp = ntime / 256; fwrite(&tmp, 1, 1, CONN); + tmp = ntime % 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=4; } ch.len_left = 0; while (ch.len_left < ch.len){ tmpi = ch.len - ch.len_left; if (tmpi > chunk_snd_max){tmpi = chunk_snd_max;} - fwrite((ch.data + ch.len_left), 1, tmpi, stdout); + fwrite((ch.data + ch.len_left), 1, tmpi, CONN); snd_cnt+=tmpi; ch.len_left += tmpi; if (ch.len_left < ch.len){ if (ch.cs_id <= 63){ - tmp = 0xC0 + ch.cs_id; fwrite(&tmp, 1, 1, stdout); + tmp = 0xC0 + ch.cs_id; fwrite(&tmp, 1, 1, CONN); snd_cnt+=1; }else{ if (ch.cs_id <= 255+64){ - tmp = 0xC0; fwrite(&tmp, 1, 1, stdout); - tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, stdout); + tmp = 0xC0; fwrite(&tmp, 1, 1, CONN); + tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, CONN); snd_cnt+=2; }else{ - tmp = 0xC1; fwrite(&tmp, 1, 1, stdout); + tmp = 0xC1; fwrite(&tmp, 1, 1, CONN); tmpi = ch.cs_id - 64; - tmp = tmpi % 256; fwrite(&tmp, 1, 1, stdout); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, stdout); + tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); snd_cnt+=4; } } @@ -310,19 +310,19 @@ struct chunkpack getChunk(){ gettimeofday(&lastrec, 0); struct chunkpack ret; unsigned char temp; - fread(&(ret.chunktype), 1, 1, stdin); + fread(&(ret.chunktype), 1, 1, CONN); rec_cnt++; //read the chunkstream ID properly switch (ret.chunktype & 0x3F){ case 0: - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); rec_cnt++; ret.cs_id = temp + 64; break; case 1: - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.cs_id = temp + 64; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.cs_id += temp * 256; rec_cnt+=2; break; @@ -334,57 +334,57 @@ struct chunkpack getChunk(){ //process the rest of the header, for each chunk type switch (ret.chunktype & 0xC0){ case 0x00: - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len = temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len += temp; ret.len_left = 0; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_type_id = temp; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_stream_id = temp; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_stream_id += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_stream_id += temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_stream_id += temp*256*256*256; rec_cnt+=11; break; case 0x40: - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp; ret.timestamp += prev.timestamp; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len = temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.len += temp; ret.len_left = 0; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.msg_type_id = temp; ret.msg_stream_id = prev.msg_stream_id; rec_cnt+=7; break; case 0x80: - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp; ret.timestamp += prev.timestamp; ret.len = prev.len; @@ -414,20 +414,20 @@ struct chunkpack getChunk(){ } //read extended timestamp, if neccesary if (ret.timestamp == 0x00ffffff){ - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp = temp*256*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp*256*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp*256; - fread(&temp, 1, 1, stdin); + fread(&temp, 1, 1, CONN); ret.timestamp += temp; rec_cnt+=4; } //read data if length > 0, and allocate it if (ret.real_len > 0){ ret.data = (unsigned char*)malloc(ret.real_len); - fread(ret.data, 1, ret.real_len, stdin); + fread(ret.data, 1, ret.real_len, CONN); rec_cnt+=ret.real_len; }else{ ret.data = 0; @@ -493,7 +493,7 @@ chunkpack getWholeChunk(){ free(ret);//cleanup returned chunk return gwc_complete; } - if (feof(stdin) != 0){break;} + if (feof(CONN) != 0){break;} counter++; } gwc_complete.msg_type_id = 0; diff --git a/Connector_RTMP/handshake.cpp b/Connector_RTMP/handshake.cpp index 43143dc8..0d0095bf 100644 --- a/Connector_RTMP/handshake.cpp +++ b/Connector_RTMP/handshake.cpp @@ -14,11 +14,11 @@ bool doHandshake(){ Handshake Client; Handshake Server; /** Read C0 **/ - fread(&(Version), 1, 1, stdin); + fread(&(Version), 1, 1, CONN); /** Read C1 **/ - fread(Client.Time, 1, 4, stdin); - fread(Client.Zero, 1, 4, stdin); - fread(Client.Random, 1, 1528, stdin); + fread(Client.Time, 1, 4, CONN); + fread(Client.Zero, 1, 4, CONN); + fread(Client.Random, 1, 1528, CONN); rec_cnt+=1537; /** Build S1 Packet **/ Server.Time[0] = 0; Server.Time[1] = 0; Server.Time[2] = 0; Server.Time[3] = 0; @@ -27,25 +27,25 @@ bool doHandshake(){ Server.Random[i] = versionstring[i%13]; } /** Send S0 **/ - fwrite(&(Version), 1, 1, stdout); + fwrite(&(Version), 1, 1, CONN); /** Send S1 **/ - fwrite(Server.Time, 1, 4, stdout); - fwrite(Server.Zero, 1, 4, stdout); - fwrite(Server.Random, 1, 1528, stdout); + fwrite(Server.Time, 1, 4, CONN); + fwrite(Server.Zero, 1, 4, CONN); + fwrite(Server.Random, 1, 1528, CONN); /** Flush output, just for certainty **/ - fflush(stdout); + fflush(CONN); snd_cnt+=1537; /** Send S2 **/ - fwrite(Client.Time, 1, 4, stdout); - fwrite(Client.Time, 1, 4, stdout); - fwrite(Client.Random, 1, 1528, stdout); + fwrite(Client.Time, 1, 4, CONN); + fwrite(Client.Time, 1, 4, CONN); + fwrite(Client.Random, 1, 1528, CONN); snd_cnt+=1536; /** Flush, necessary in order to work **/ - fflush(stdout); + fflush(CONN); /** Read and discard C2 **/ - fread(Client.Time, 1, 4, stdin); - fread(Client.Zero, 1, 4, stdin); - fread(Client.Random, 1, 1528, stdin); + fread(Client.Time, 1, 4, CONN); + fread(Client.Zero, 1, 4, CONN); + fread(Client.Random, 1, 1528, CONN); rec_cnt+=1536; return true; }//doHandshake @@ -57,10 +57,10 @@ bool doHandshake(){ bool doHandshake(){ char Version; /** Read C0 **/ - fread(&Version, 1, 1, stdin); + fread(&Version, 1, 1, CONN); uint8_t Client[1536]; uint8_t Server[3072]; - fread(&Client, 1, 1536, stdin); + fread(&Client, 1, 1536, CONN); rec_cnt+=1537; /** Build S1 Packet **/ @@ -123,13 +123,13 @@ bool doHandshake(){ delete[] pLastHash; //***** DONE BUILDING THE RESPONSE ***// /** Send response **/ - fwrite(&Version, 1, 1, stdout); - fwrite(&Server, 1, 3072, stdout); + fwrite(&Version, 1, 1, CONN); + fwrite(&Server, 1, 3072, CONN); snd_cnt+=3073; /** Flush, necessary in order to work **/ - fflush(stdout); + fflush(CONN); /** Read and discard C2 **/ - fread(Client, 1, 1536, stdin); + fread(Client, 1, 1536, CONN); rec_cnt+=1536; return true; } diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 5d3298ee..991dd75f 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -3,6 +3,7 @@ #include #include #include +#include //for connection to server #include "../sockets/SocketW.h" @@ -11,11 +12,30 @@ bool inited = false; bool stopparsing = false; timeval lastrec; +int CONN = 0; #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking #include "../util/flv_sock.cpp" //FLV parsing with SocketW +#include "../util/ddv_socket.cpp" //DDVTech Socket wrapper int main(){ + + int server_socket = DDV_Listen(1935); + while (server_socket > 0){ + CONN = DDV_Accept(server_socket); + pid_t myid = fork(); + if (myid == 0){ + break; + }else{ + printf("Spawned new process %i for incoming client\n", (int)myid); + } + } + if (server_socket <= 0){ + return 0; + } + + + unsigned int ts; unsigned int fts = 0; unsigned int ftst; diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp new file mode 100644 index 00000000..82bf1b7e --- /dev/null +++ b/util/ddv_socket.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include +#include + + +int DDV_Listen(int port){ + int s = socket(AF_INET, SOCK_STREAM, 0); + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port);//port 8888 + inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr);//listen on all interfaces + ret = bind(sock, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port + if (ret == 0){ + ret = listen(sock, 100);//start listening, backlog of 100 allowed + if (ret == 0){ + return s; + }else{ + printf("Listen failed! Error: %s\n", strerror(errno)); + close(s); + return 0; + } + }else{ + printf("Binding failed! Error: %s\n", strerror(errno)); + close(s); + return 0; + } +} + +int DDV_Accept(int sock){ + int r = accept(sock, 0, 0); + if (r != -1){ + return fdopen(r, "r+"); + }else{ + return -1; + } +} From 55f72227c63fd17cbfa33f167b74430f590a0f49 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 22:52:00 +0100 Subject: [PATCH 19/60] Compilende versie RTMP superconnector --- Connector_RTMP/main.cpp | 3 +-- PLS | 14 -------------- util/ddv_socket.cpp | 8 ++++---- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 991dd75f..b8502f92 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -12,7 +12,7 @@ bool inited = false; bool stopparsing = false; timeval lastrec; -int CONN = 0; +FILE * CONN = 0; #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking #include "../util/flv_sock.cpp" //FLV parsing with SocketW @@ -43,7 +43,6 @@ int main(){ //first timestamp set firsttime = getNowMS(); - int teller = 0; #ifdef DEBUG fprintf(stderr, "Doing handshake...\n"); diff --git a/PLS b/PLS index d041a879..e6eda2ea 100644 --- a/PLS +++ b/PLS @@ -12,20 +12,6 @@ service ddvtechhttp cps = 100 5 } -service ddvtechrtmp -{ - disable = no - type = UNLISTED - protocol = tcp - socket_type = stream - user = root - server = /usr/bin/Connector_RTMP - port = 1935 - wait = no - per_source = 10 - cps = 100 5 -} - service ddvtechraw { disable = no diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 82bf1b7e..17f06366 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -14,9 +14,9 @@ int DDV_Listen(int port){ addr.sin_family = AF_INET; addr.sin_port = htons(port);//port 8888 inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr);//listen on all interfaces - ret = bind(sock, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port + int ret = bind(s, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port if (ret == 0){ - ret = listen(sock, 100);//start listening, backlog of 100 allowed + ret = listen(s, 100);//start listening, backlog of 100 allowed if (ret == 0){ return s; }else{ @@ -31,11 +31,11 @@ int DDV_Listen(int port){ } } -int DDV_Accept(int sock){ +FILE * DDV_Accept(int sock){ int r = accept(sock, 0, 0); if (r != -1){ return fdopen(r, "r+"); }else{ - return -1; + return (FILE*)0; } } From c45ee6f358d906aeee0b9a7946e375bac6005c1a Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:11:24 +0100 Subject: [PATCH 20/60] Poging drie --- Connector_RTMP/main.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index b8502f92..d3cfd46e 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -4,6 +4,8 @@ #include #include #include +#include + //for connection to server #include "../sockets/SocketW.h" @@ -20,6 +22,10 @@ FILE * CONN = 0; int main(){ + //automatic child reaping + struct sigaction sa = {.sa_handler = SIG_IGN}; + sigaction(SIGCHLD, &sa, NULL); + int server_socket = DDV_Listen(1935); while (server_socket > 0){ CONN = DDV_Accept(server_socket); @@ -65,7 +71,7 @@ int main(){ //rightnow = getNowMS(); if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){ parseChunk(); - fflush(stdout); + fflush(CONN); } if (ready4data){ if (!inited){ From 8c271feb87faeddbba2be42a5c6c218dbd1e953e Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:12:35 +0100 Subject: [PATCH 21/60] Poging drie --- Connector_RTMP/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index d3cfd46e..c6ae15c9 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -23,7 +23,7 @@ FILE * CONN = 0; int main(){ //automatic child reaping - struct sigaction sa = {.sa_handler = SIG_IGN}; + struct sigaction sa = {sa_handler = SIG_IGN}; sigaction(SIGCHLD, &sa, NULL); int server_socket = DDV_Listen(1935); From 3c8d9e4f546a995bc70563fbf348cba94c36edb9 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:19:16 +0100 Subject: [PATCH 22/60] Nog een poging... --- Connector_RTMP/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index c6ae15c9..8f8d1ac7 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -5,7 +5,8 @@ #include #include #include - +#include +#include //for connection to server #include "../sockets/SocketW.h" @@ -22,12 +23,10 @@ FILE * CONN = 0; int main(){ - //automatic child reaping - struct sigaction sa = {sa_handler = SIG_IGN}; - sigaction(SIGCHLD, &sa, NULL); - int server_socket = DDV_Listen(1935); + int status; while (server_socket > 0){ + waitpid((pid_t)-1, &status, WNOHANG); CONN = DDV_Accept(server_socket); pid_t myid = fork(); if (myid == 0){ From 9fcecc9015a501db2960b67f5a1778e9d6dada87 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:22:34 +0100 Subject: [PATCH 23/60] Nog een poging... --- Connector_RTMP/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 8f8d1ac7..08acd115 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -1,4 +1,4 @@ -#undef DEBUG +#define DEBUG #include #include #include @@ -65,8 +65,8 @@ int main(){ #ifdef DEBUG fprintf(stderr, "Starting processing...\n"); #endif - while (!ferror(stdin) && !ferror(stdout)){ - //only parse input from stdin if available or not yet init'ed + while (!ferror(CONN)){ + //only parse input if available or not yet init'ed //rightnow = getNowMS(); if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){ parseChunk(); From 4a6de43ed7ee16a4a2bdf19c0a5b5985cee830a9 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:37:08 +0100 Subject: [PATCH 24/60] Nog een poging... --- Connector_RTMP/main.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 08acd115..0c83d9f5 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include //for connection to server #include "../sockets/SocketW.h" @@ -65,10 +66,25 @@ int main(){ #ifdef DEBUG fprintf(stderr, "Starting processing...\n"); #endif + + + int retval; + int poller = epoll_create(1); + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLOUT; + ev.data.fd = fileno(CONN); + epoll_ctl(poller, EPOLL_CTL_ADD, fileno(CONN), &ev); + struct epoll_event events[1]; + + + + while (!ferror(CONN)){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); - if ((!ready4data || (snd_cnt - snd_window_at >= snd_window_size)) && !stopparsing){ + retval = epoll_wait(poller, events, 1, 1000); + if (retval){ + fprintf(stderr, "Socket %i is now state %i, in is %i, out is %i\n", events[0].data.fd, events[0].events, EPOLLIN, EPOLLOUT); parseChunk(); fflush(CONN); } From 4ad85c9aac0cb984c2e13c1602208ab052dc35b6 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:41:38 +0100 Subject: [PATCH 25/60] Nog een poging... --- Connector_RTMP/main.cpp | 107 +++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 0c83d9f5..1bc1f300 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -79,68 +79,71 @@ int main(){ - while (!ferror(CONN)){ + while (!ferror(CONN) && !feof(CONN)){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 1000); if (retval){ - fprintf(stderr, "Socket %i is now state %i, in is %i, out is %i\n", events[0].data.fd, events[0].events, EPOLLIN, EPOLLOUT); - parseChunk(); - fflush(CONN); - } - if (ready4data){ - if (!inited){ - //we are ready, connect the socket! - if (!ss.connect(streamname.c_str())){ - #ifdef DEBUG - fprintf(stderr, "Could not connect to server!\n"); - #endif - return 0; - } - FLV_Readheader(ss);//read the header, we don't want it - #ifdef DEBUG - fprintf(stderr, "Header read, starting to send video data...\n"); - #endif - inited = true; + if (events[0].events & EPOLLIN){ + parseChunk(); + fflush(CONN); } - //only send data if previous data has been ACK'ed... - if (snd_cnt - snd_window_at < snd_window_size){ - if (FLV_GetPacket(ss)){//able to read a full packet? - ts = FLVbuffer[7] * 256*256*256; - ts += FLVbuffer[4] * 256*256; - ts += FLVbuffer[5] * 256; - ts += FLVbuffer[6]; - if (ts != 0){ - if (fts == 0){fts = ts;ftst = getNowMS();} - ts -= fts; - FLVbuffer[7] = ts / (256*256*256); - FLVbuffer[4] = ts / (256*256); - FLVbuffer[5] = ts / 256; - FLVbuffer[6] = ts % 256; - ts += ftst; - }else{ - ftst = getNowMS(); - FLVbuffer[7] = ftst / (256*256*256); - FLVbuffer[4] = ftst / (256*256); - FLVbuffer[5] = ftst / 256; - FLVbuffer[6] = ftst % 256; + if (events[0].events & EPOLLOUT){ + if (ready4data){ + if (!inited){ + //we are ready, connect the socket! + if (!ss.connect(streamname.c_str())){ + #ifdef DEBUG + fprintf(stderr, "Could not connect to server!\n"); + #endif + return 0; + } + FLV_Readheader(ss);//read the header, we don't want it + #ifdef DEBUG + fprintf(stderr, "Header read, starting to send video data...\n"); + #endif + inited = true; + } + //only send data if previous data has been ACK'ed... + if (snd_cnt - snd_window_at < snd_window_size){ + if (FLV_GetPacket(ss)){//able to read a full packet? + ts = FLVbuffer[7] * 256*256*256; + ts += FLVbuffer[4] * 256*256; + ts += FLVbuffer[5] * 256; + ts += FLVbuffer[6]; + if (ts != 0){ + if (fts == 0){fts = ts;ftst = getNowMS();} + ts -= fts; + FLVbuffer[7] = ts / (256*256*256); + FLVbuffer[4] = ts / (256*256); + FLVbuffer[5] = ts / 256; + FLVbuffer[6] = ts % 256; + ts += ftst; + }else{ + ftst = getNowMS(); + FLVbuffer[7] = ftst / (256*256*256); + FLVbuffer[4] = ftst / (256*256); + FLVbuffer[5] = ftst / 256; + FLVbuffer[6] = ftst % 256; + } + SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); + FLV_Dump();//dump packet and get ready for next + } + if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ + #ifdef DEBUG + fprintf(stderr, "No more data! :-( (%s)\n", SWBerr.get_error().c_str()); + #endif + return 0;//no more input possible! Fail immediately. + } } - SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); - FLV_Dump();//dump packet and get ready for next } - if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ - #ifdef DEBUG - fprintf(stderr, "No more data! :-( (%s)\n", SWBerr.get_error().c_str()); - #endif - return 0;//no more input possible! Fail immediately. + //send ACK if we received a whole window + if (rec_cnt - rec_window_at > rec_window_size){ + rec_window_at = rec_cnt; + SendCTL(3, rec_cnt);//send ack (msg 3) } } } - //send ACK if we received a whole window - if (rec_cnt - rec_window_at > rec_window_size){ - rec_window_at = rec_cnt; - SendCTL(3, rec_cnt);//send ack (msg 3) - } } #ifdef DEBUG fprintf(stderr, "User disconnected.\n"); From 4776cd08d77c92f177520c7adda4532c364f9ba0 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:45:29 +0100 Subject: [PATCH 26/60] Nog een poging... --- Connector_RTMP/main.cpp | 114 +++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 59 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 1bc1f300..d2b53d16 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -71,7 +71,7 @@ int main(){ int retval; int poller = epoll_create(1); struct epoll_event ev; - ev.events = EPOLLIN | EPOLLOUT; + ev.events = EPOLLIN; ev.data.fd = fileno(CONN); epoll_ctl(poller, EPOLL_CTL_ADD, fileno(CONN), &ev); struct epoll_event events[1]; @@ -82,68 +82,64 @@ int main(){ while (!ferror(CONN) && !feof(CONN)){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); - retval = epoll_wait(poller, events, 1, 1000); - if (retval){ - if (events[0].events & EPOLLIN){ - parseChunk(); - fflush(CONN); - } - if (events[0].events & EPOLLOUT){ - if (ready4data){ - if (!inited){ - //we are ready, connect the socket! - if (!ss.connect(streamname.c_str())){ - #ifdef DEBUG - fprintf(stderr, "Could not connect to server!\n"); - #endif - return 0; - } - FLV_Readheader(ss);//read the header, we don't want it - #ifdef DEBUG - fprintf(stderr, "Header read, starting to send video data...\n"); - #endif - inited = true; - } - //only send data if previous data has been ACK'ed... - if (snd_cnt - snd_window_at < snd_window_size){ - if (FLV_GetPacket(ss)){//able to read a full packet? - ts = FLVbuffer[7] * 256*256*256; - ts += FLVbuffer[4] * 256*256; - ts += FLVbuffer[5] * 256; - ts += FLVbuffer[6]; - if (ts != 0){ - if (fts == 0){fts = ts;ftst = getNowMS();} - ts -= fts; - FLVbuffer[7] = ts / (256*256*256); - FLVbuffer[4] = ts / (256*256); - FLVbuffer[5] = ts / 256; - FLVbuffer[6] = ts % 256; - ts += ftst; - }else{ - ftst = getNowMS(); - FLVbuffer[7] = ftst / (256*256*256); - FLVbuffer[4] = ftst / (256*256); - FLVbuffer[5] = ftst / 256; - FLVbuffer[6] = ftst % 256; - } - SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); - FLV_Dump();//dump packet and get ready for next - } - if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ - #ifdef DEBUG - fprintf(stderr, "No more data! :-( (%s)\n", SWBerr.get_error().c_str()); - #endif - return 0;//no more input possible! Fail immediately. - } - } + retval = epoll_wait(poller, events, 1, 100); + if (retval > 0){ + parseChunk(); + fflush(CONN); + } + if (ready4data){ + if (!inited){ + //we are ready, connect the socket! + if (!ss.connect(streamname.c_str())){ + #ifdef DEBUG + fprintf(stderr, "Could not connect to server!\n"); + #endif + return 0; } - //send ACK if we received a whole window - if (rec_cnt - rec_window_at > rec_window_size){ - rec_window_at = rec_cnt; - SendCTL(3, rec_cnt);//send ack (msg 3) + FLV_Readheader(ss);//read the header, we don't want it + #ifdef DEBUG + fprintf(stderr, "Header read, starting to send video data...\n"); + #endif + inited = true; + } + //only send data if previous data has been ACK'ed... + if (snd_cnt - snd_window_at < snd_window_size){ + if (FLV_GetPacket(ss)){//able to read a full packet? + ts = FLVbuffer[7] * 256*256*256; + ts += FLVbuffer[4] * 256*256; + ts += FLVbuffer[5] * 256; + ts += FLVbuffer[6]; + if (ts != 0){ + if (fts == 0){fts = ts;ftst = getNowMS();} + ts -= fts; + FLVbuffer[7] = ts / (256*256*256); + FLVbuffer[4] = ts / (256*256); + FLVbuffer[5] = ts / 256; + FLVbuffer[6] = ts % 256; + ts += ftst; + }else{ + ftst = getNowMS(); + FLVbuffer[7] = ftst / (256*256*256); + FLVbuffer[4] = ftst / (256*256); + FLVbuffer[5] = ftst / 256; + FLVbuffer[6] = ftst % 256; + } + SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); + FLV_Dump();//dump packet and get ready for next + } + if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ + #ifdef DEBUG + fprintf(stderr, "No more data! :-( (%s)\n", SWBerr.get_error().c_str()); + #endif + return 0;//no more input possible! Fail immediately. } } } + //send ACK if we received a whole window + if (rec_cnt - rec_window_at > rec_window_size){ + rec_window_at = rec_cnt; + SendCTL(3, rec_cnt);//send ack (msg 3) + } } #ifdef DEBUG fprintf(stderr, "User disconnected.\n"); From 66b8de0a86ac7788bb4633442ad393a0b7837dcd Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:50:20 +0100 Subject: [PATCH 27/60] Nog een poging... --- Connector_RTMP/main.cpp | 8 +++++--- util/ddv_socket.cpp | 9 ++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index d2b53d16..caeba255 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -16,6 +16,7 @@ bool inited = false; bool stopparsing = false; timeval lastrec; +int CONN_fd = 0; FILE * CONN = 0; #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking @@ -28,7 +29,8 @@ int main(){ int status; while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); - CONN = DDV_Accept(server_socket); + CONN_fd = DDV_Accept(server_socket); + CONN = fdopen(CONN_fd, "r+"); pid_t myid = fork(); if (myid == 0){ break; @@ -72,8 +74,8 @@ int main(){ int poller = epoll_create(1); struct epoll_event ev; ev.events = EPOLLIN; - ev.data.fd = fileno(CONN); - epoll_ctl(poller, EPOLL_CTL_ADD, fileno(CONN), &ev); + ev.data.fd = CONN_fd; + epoll_ctl(poller, EPOLL_CTL_ADD, CONN_fd, &ev); struct epoll_event events[1]; diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 17f06366..beb23d41 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -31,11 +31,6 @@ int DDV_Listen(int port){ } } -FILE * DDV_Accept(int sock){ - int r = accept(sock, 0, 0); - if (r != -1){ - return fdopen(r, "r+"); - }else{ - return (FILE*)0; - } +int DDV_Accept(int sock){ + return accept(sock, 0, 0); } From 667859d984a6c34fa33f76847fbedf7af30d296b Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:53:22 +0100 Subject: [PATCH 28/60] Nog een poging... --- Connector_RTMP/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index caeba255..d5be60d1 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -51,6 +51,8 @@ int main(){ //first timestamp set firsttime = getNowMS(); + int now = getNowMS(); + int lastcheck = now; #ifdef DEBUG fprintf(stderr, "Doing handshake...\n"); @@ -85,7 +87,8 @@ int main(){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 100); - if (retval > 0){ + now = getNowMS(); + if ((retval > 0) || ((now - lastcheck > 1000) && (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)))){ parseChunk(); fflush(CONN); } From a0cf9af7e21b4ac147a34330c98414a98f5f328d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:57:21 +0100 Subject: [PATCH 29/60] Nog een poging... --- Connector_RTMP/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index d5be60d1..c83c45de 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -88,7 +88,8 @@ int main(){ //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 100); now = getNowMS(); - if ((retval > 0) || ((now - lastcheck > 1000) && (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)))){ + if ((retval > 0) || ((now - lastcheck > 1) && (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)))){ + lastcheck = now; parseChunk(); fflush(CONN); } From afa3a46a9bd1f061761e6c661ad94710c2a13dec Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:00:42 +0100 Subject: [PATCH 30/60] Nog een poging... --- Connector_RTMP/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index c83c45de..717e1eeb 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -131,6 +131,9 @@ int main(){ FLVbuffer[6] = ftst % 256; } SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); + #ifdef DEBUG + fprintf(stderr, "Sent a tag.\n"); + #endif FLV_Dump();//dump packet and get ready for next } if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ From 8b7781fcfbd5426aa04d15d6662107e3fa73ed0c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:22:46 +0100 Subject: [PATCH 31/60] Nog een poging... --- Connector_RTMP/main.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 717e1eeb..0f10af0f 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -30,7 +30,6 @@ int main(){ while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); CONN_fd = DDV_Accept(server_socket); - CONN = fdopen(CONN_fd, "r+"); pid_t myid = fork(); if (myid == 0){ break; @@ -42,6 +41,7 @@ int main(){ return 0; } + CONN = fdopen(CONN_fd, "r+"); unsigned int ts; @@ -51,8 +51,6 @@ int main(){ //first timestamp set firsttime = getNowMS(); - int now = getNowMS(); - int lastcheck = now; #ifdef DEBUG fprintf(stderr, "Doing handshake...\n"); @@ -86,12 +84,9 @@ int main(){ while (!ferror(CONN) && !feof(CONN)){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); - retval = epoll_wait(poller, events, 1, 100); - now = getNowMS(); - if ((retval > 0) || ((now - lastcheck > 1) && (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)))){ - lastcheck = now; + retval = epoll_wait(poller, events, 1, 0); + if ((retval > 0) || (!ready4data || (snd_cnt - snd_window_at >= snd_window_size))){ parseChunk(); - fflush(CONN); } if (ready4data){ if (!inited){ From 8c646c63917757381b5d82ac6b8d637a19592eb3 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:34:30 +0100 Subject: [PATCH 32/60] Nog een poging... --- Connector_RTMP/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 0f10af0f..bc104529 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -34,7 +34,7 @@ int main(){ if (myid == 0){ break; }else{ - printf("Spawned new process %i for incoming client\n", (int)myid); + printf("Spawned new process %i for handling socket %i\n", (int)myid, CONN_fd); } } if (server_socket <= 0){ @@ -127,7 +127,7 @@ int main(){ } SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); #ifdef DEBUG - fprintf(stderr, "Sent a tag.\n"); + fprintf(stderr, "Sent a tag to %i\n", CONN_fd); #endif FLV_Dump();//dump packet and get ready for next } From 0e68f770e3e83f22097aacd0e25fa8ea7541cb14 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:56:49 +0100 Subject: [PATCH 33/60] Nog een poging... --- Connector_RTMP/chunkstream.cpp | 124 ++++++++++++++++----------------- Connector_RTMP/handshake.cpp | 44 ++++++------ Connector_RTMP/main.cpp | 4 -- util/ddv_socket.cpp | 8 +++ 4 files changed, 92 insertions(+), 88 deletions(-) diff --git a/Connector_RTMP/chunkstream.cpp b/Connector_RTMP/chunkstream.cpp index f097098e..22eacab9 100644 --- a/Connector_RTMP/chunkstream.cpp +++ b/Connector_RTMP/chunkstream.cpp @@ -108,18 +108,18 @@ void SendChunk(chunkpack ch){ } } if (ch.cs_id <= 63){ - tmp = chtype | ch.cs_id; fwrite(&tmp, 1, 1, CONN); + tmp = chtype | ch.cs_id; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=1; }else{ if (ch.cs_id <= 255+64){ - tmp = chtype | 0; fwrite(&tmp, 1, 1, CONN); - tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, CONN); + tmp = chtype | 0; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ch.cs_id - 64; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=2; }else{ - tmp = chtype | 1; fwrite(&tmp, 1, 1, CONN); + tmp = chtype | 1; DDV_write(&tmp, 1, 1, CONN_fd); tmpi = ch.cs_id - 64; - tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi % 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi / 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=3; } } @@ -129,67 +129,67 @@ void SendChunk(chunkpack ch){ if (chtype == 0x00){ tmpi = ch.timestamp; if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;} - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / (256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi / 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi % 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=3; }else{ tmpi = ch.timestamp - prev.timestamp; if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;} - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / (256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi / 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi % 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=3; } if (chtype != 0x80){ //len tmpi = ch.len; - tmp = tmpi / (256*256); fwrite(&tmp, 1, 1, CONN); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); - tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi / (256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi / 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi % 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=3; //msg type id - tmp = ch.msg_type_id; fwrite(&tmp, 1, 1, CONN); + tmp = ch.msg_type_id; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=1; if (chtype != 0x40){ //msg stream id - tmp = ch.msg_stream_id % 256; fwrite(&tmp, 1, 1, CONN); - tmp = ch.msg_stream_id / 256; fwrite(&tmp, 1, 1, CONN); - tmp = ch.msg_stream_id / (256*256); fwrite(&tmp, 1, 1, CONN); - tmp = ch.msg_stream_id / (256*256*256); fwrite(&tmp, 1, 1, CONN); + tmp = ch.msg_stream_id % 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ch.msg_stream_id / 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ch.msg_stream_id / (256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ch.msg_stream_id / (256*256*256); DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=4; } } } //support for 0x00ffffff timestamps if (ntime){ - tmp = ntime / (256*256*256); fwrite(&tmp, 1, 1, CONN); - tmp = ntime / (256*256); fwrite(&tmp, 1, 1, CONN); - tmp = ntime / 256; fwrite(&tmp, 1, 1, CONN); - tmp = ntime % 256; fwrite(&tmp, 1, 1, CONN); + tmp = ntime / (256*256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ntime / (256*256); DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ntime / 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ntime % 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=4; } ch.len_left = 0; while (ch.len_left < ch.len){ tmpi = ch.len - ch.len_left; if (tmpi > chunk_snd_max){tmpi = chunk_snd_max;} - fwrite((ch.data + ch.len_left), 1, tmpi, CONN); + DDV_write((ch.data + ch.len_left), 1, tmpi, CONN_fd); snd_cnt+=tmpi; ch.len_left += tmpi; if (ch.len_left < ch.len){ if (ch.cs_id <= 63){ - tmp = 0xC0 + ch.cs_id; fwrite(&tmp, 1, 1, CONN); + tmp = 0xC0 + ch.cs_id; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=1; }else{ if (ch.cs_id <= 255+64){ - tmp = 0xC0; fwrite(&tmp, 1, 1, CONN); - tmp = ch.cs_id - 64; fwrite(&tmp, 1, 1, CONN); + tmp = 0xC0; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = ch.cs_id - 64; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=2; }else{ - tmp = 0xC1; fwrite(&tmp, 1, 1, CONN); + tmp = 0xC1; DDV_write(&tmp, 1, 1, CONN_fd); tmpi = ch.cs_id - 64; - tmp = tmpi % 256; fwrite(&tmp, 1, 1, CONN); - tmp = tmpi / 256; fwrite(&tmp, 1, 1, CONN); + tmp = tmpi % 256; DDV_write(&tmp, 1, 1, CONN_fd); + tmp = tmpi / 256; DDV_write(&tmp, 1, 1, CONN_fd); snd_cnt+=4; } } @@ -310,19 +310,19 @@ struct chunkpack getChunk(){ gettimeofday(&lastrec, 0); struct chunkpack ret; unsigned char temp; - fread(&(ret.chunktype), 1, 1, CONN); + DDV_read(&(ret.chunktype), 1, 1, CONN_fd); rec_cnt++; //read the chunkstream ID properly switch (ret.chunktype & 0x3F){ case 0: - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); rec_cnt++; ret.cs_id = temp + 64; break; case 1: - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.cs_id = temp + 64; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.cs_id += temp * 256; rec_cnt+=2; break; @@ -334,57 +334,57 @@ struct chunkpack getChunk(){ //process the rest of the header, for each chunk type switch (ret.chunktype & 0xC0){ case 0x00: - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len = temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len += temp; ret.len_left = 0; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_type_id = temp; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_stream_id = temp; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_stream_id += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_stream_id += temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_stream_id += temp*256*256*256; rec_cnt+=11; break; case 0x40: - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp; ret.timestamp += prev.timestamp; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len = temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.len += temp; ret.len_left = 0; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.msg_type_id = temp; ret.msg_stream_id = prev.msg_stream_id; rec_cnt+=7; break; case 0x80: - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp = temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp; ret.timestamp += prev.timestamp; ret.len = prev.len; @@ -414,20 +414,20 @@ struct chunkpack getChunk(){ } //read extended timestamp, if neccesary if (ret.timestamp == 0x00ffffff){ - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp = temp*256*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp*256*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp*256; - fread(&temp, 1, 1, CONN); + DDV_read(&temp, 1, 1, CONN_fd); ret.timestamp += temp; rec_cnt+=4; } //read data if length > 0, and allocate it if (ret.real_len > 0){ ret.data = (unsigned char*)malloc(ret.real_len); - fread(ret.data, 1, ret.real_len, CONN); + DDV_read(ret.data, 1, ret.real_len, CONN_fd); rec_cnt+=ret.real_len; }else{ ret.data = 0; @@ -493,7 +493,7 @@ chunkpack getWholeChunk(){ free(ret);//cleanup returned chunk return gwc_complete; } - if (feof(CONN) != 0){break;} + if (feof(CONN_fd) != 0){break;} counter++; } gwc_complete.msg_type_id = 0; diff --git a/Connector_RTMP/handshake.cpp b/Connector_RTMP/handshake.cpp index 0d0095bf..a8461a83 100644 --- a/Connector_RTMP/handshake.cpp +++ b/Connector_RTMP/handshake.cpp @@ -14,11 +14,11 @@ bool doHandshake(){ Handshake Client; Handshake Server; /** Read C0 **/ - fread(&(Version), 1, 1, CONN); + DDV_read(&(Version), 1, 1, CONN_fd); /** Read C1 **/ - fread(Client.Time, 1, 4, CONN); - fread(Client.Zero, 1, 4, CONN); - fread(Client.Random, 1, 1528, CONN); + DDV_read(Client.Time, 1, 4, CONN_fd); + DDV_read(Client.Zero, 1, 4, CONN_fd); + DDV_read(Client.Random, 1, 1528, CONN_fd); rec_cnt+=1537; /** Build S1 Packet **/ Server.Time[0] = 0; Server.Time[1] = 0; Server.Time[2] = 0; Server.Time[3] = 0; @@ -27,25 +27,25 @@ bool doHandshake(){ Server.Random[i] = versionstring[i%13]; } /** Send S0 **/ - fwrite(&(Version), 1, 1, CONN); + DDV_write(&(Version), 1, 1, CONN_fd); /** Send S1 **/ - fwrite(Server.Time, 1, 4, CONN); - fwrite(Server.Zero, 1, 4, CONN); - fwrite(Server.Random, 1, 1528, CONN); + DDV_write(Server.Time, 1, 4, CONN_fd); + DDV_write(Server.Zero, 1, 4, CONN_fd); + DDV_write(Server.Random, 1, 1528, CONN_fd); /** Flush output, just for certainty **/ - fflush(CONN); + //fflush(CONN_fd); snd_cnt+=1537; /** Send S2 **/ - fwrite(Client.Time, 1, 4, CONN); - fwrite(Client.Time, 1, 4, CONN); - fwrite(Client.Random, 1, 1528, CONN); + DDV_write(Client.Time, 1, 4, CONN_fd); + DDV_write(Client.Time, 1, 4, CONN_fd); + DDV_write(Client.Random, 1, 1528, CONN_fd); snd_cnt+=1536; /** Flush, necessary in order to work **/ - fflush(CONN); + //fflush(CONN_fd); /** Read and discard C2 **/ - fread(Client.Time, 1, 4, CONN); - fread(Client.Zero, 1, 4, CONN); - fread(Client.Random, 1, 1528, CONN); + DDV_read(Client.Time, 1, 4, CONN_fd); + DDV_read(Client.Zero, 1, 4, CONN_fd); + DDV_read(Client.Random, 1, 1528, CONN_fd); rec_cnt+=1536; return true; }//doHandshake @@ -57,10 +57,10 @@ bool doHandshake(){ bool doHandshake(){ char Version; /** Read C0 **/ - fread(&Version, 1, 1, CONN); + DDV_read(&Version, 1, 1, CONN_fd); uint8_t Client[1536]; uint8_t Server[3072]; - fread(&Client, 1, 1536, CONN); + DDV_read(&Client, 1, 1536, CONN_fd); rec_cnt+=1537; /** Build S1 Packet **/ @@ -123,13 +123,13 @@ bool doHandshake(){ delete[] pLastHash; //***** DONE BUILDING THE RESPONSE ***// /** Send response **/ - fwrite(&Version, 1, 1, CONN); - fwrite(&Server, 1, 3072, CONN); + DDV_write(&Version, 1, 1, CONN_fd); + DDV_write(&Server, 1, 3072, CONN_fd); snd_cnt+=3073; /** Flush, necessary in order to work **/ - fflush(CONN); + //fflush(CONN_fd); /** Read and discard C2 **/ - fread(Client, 1, 1536, CONN); + DDV_read(Client, 1, 1536, CONN_fd); rec_cnt+=1536; return true; } diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index bc104529..00311e3a 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -17,7 +17,6 @@ bool stopparsing = false; timeval lastrec; int CONN_fd = 0; -FILE * CONN = 0; #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking #include "../util/flv_sock.cpp" //FLV parsing with SocketW @@ -41,9 +40,6 @@ int main(){ return 0; } - CONN = fdopen(CONN_fd, "r+"); - - unsigned int ts; unsigned int fts = 0; unsigned int ftst; diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index beb23d41..bc6fe670 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -34,3 +34,11 @@ int DDV_Listen(int port){ int DDV_Accept(int sock){ return accept(sock, 0, 0); } + +bool DDV_write(char * buffer, int width, int count, int sock){ + return (send(sock, buffer, width*count, 0) == width*count); +} + +bool DDV_read(char * buffer, int width, int count, int sock){ + return (recv(sock, buffer, width*count, 0) == width*count); +} From 6ebf3d7b666fbeb9c0de9c46c07423fba610132c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:58:05 +0100 Subject: [PATCH 34/60] Nog een poging... --- Connector_RTMP/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 00311e3a..25cba8e2 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -17,10 +17,10 @@ bool stopparsing = false; timeval lastrec; int CONN_fd = 0; -#include "parsechunks.cpp" //chunkstream parsing -#include "handshake.cpp" //handshaking #include "../util/flv_sock.cpp" //FLV parsing with SocketW #include "../util/ddv_socket.cpp" //DDVTech Socket wrapper +#include "parsechunks.cpp" //chunkstream parsing +#include "handshake.cpp" //handshaking int main(){ From 13ae8307279a7e5015c35b7c92eed03ea1ee8e2d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:00:22 +0100 Subject: [PATCH 35/60] Nog een poging... --- Connector_RTMP/main.cpp | 2 +- util/ddv_socket.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 25cba8e2..0f777071 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -77,7 +77,7 @@ int main(){ - while (!ferror(CONN) && !feof(CONN)){ + while (!socketError){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 0); diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index bc6fe670..595ab2bb 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -6,6 +6,7 @@ #include #include +bool socketError = false; int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); @@ -36,9 +37,13 @@ int DDV_Accept(int sock){ } bool DDV_write(char * buffer, int width, int count, int sock){ - return (send(sock, buffer, width*count, 0) == width*count); + bool r = (send(sock, buffer, width*count, 0) == width*count); + if (!r){socketError = true} + return r; } bool DDV_read(char * buffer, int width, int count, int sock){ - return (recv(sock, buffer, width*count, 0) == width*count); + bool r = (recv(sock, buffer, width*count, 0) == width*count); + if (!r){socketError = true} + return r; } From 57d076a6f4e084813b2ef689f7a898bd539074df Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:00:52 +0100 Subject: [PATCH 36/60] Nog een poging... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 595ab2bb..72201cf0 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -36,13 +36,13 @@ int DDV_Accept(int sock){ return accept(sock, 0, 0); } -bool DDV_write(char * buffer, int width, int count, int sock){ +bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); if (!r){socketError = true} return r; } -bool DDV_read(char * buffer, int width, int count, int sock){ +bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); if (!r){socketError = true} return r; From bbd7d8801156860885940a1066e70266cd210f27 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:01:33 +0100 Subject: [PATCH 37/60] Nog een poging... --- Connector_RTMP/chunkstream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Connector_RTMP/chunkstream.cpp b/Connector_RTMP/chunkstream.cpp index 22eacab9..019118b5 100644 --- a/Connector_RTMP/chunkstream.cpp +++ b/Connector_RTMP/chunkstream.cpp @@ -493,7 +493,7 @@ chunkpack getWholeChunk(){ free(ret);//cleanup returned chunk return gwc_complete; } - if (feof(CONN_fd) != 0){break;} + if (socketError){break;} counter++; } gwc_complete.msg_type_id = 0; From 3ae420a6b1863cf0e365d670d1597b11ad35606f Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:01:59 +0100 Subject: [PATCH 38/60] Nog een poging... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 72201cf0..6ab42140 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -38,12 +38,12 @@ int DDV_Accept(int sock){ bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true} + if (!r){socketError = true;} return r; } bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true} + if (!r){socketError = true;} return r; } From abdc67b738470177c26209a9d7684c555d0f4eaf Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:04:11 +0100 Subject: [PATCH 39/60] Nog een poging... --- util/ddv_socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 6ab42140..1217293a 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -38,12 +38,18 @@ int DDV_Accept(int sock){ bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true;} + if (!r){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } return r; } bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true;} + if (!r){ + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + } return r; } From ae430864091814126114d76a0bd613ae676ebbeb Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:14:23 +0100 Subject: [PATCH 40/60] Nog een poging... --- util/ddv_socket.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1217293a..56e298de 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -37,19 +37,31 @@ int DDV_Accept(int sock){ } bool DDV_write(void * buffer, int width, int count, int sock){ - bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){ - socketError = true; - printf("Could not write! %s\n", strerror(errno)); + int sofar = 0; + int todo = width*count; + while (sofar != todo){ + int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + } + sofar += r; } - return r; + return true; } bool DDV_read(void * buffer, int width, int count, int sock){ - bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){ - socketError = true; - printf("Could not read! %s\n", strerror(errno)); + int sofar = 0; + int todo = width*count; + while (sofar != todo){ + int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); + if (r < 0){ + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + } + sofar += r; } - return r; + return true; } From fb4ddbba8c7571461a8967cc3b2ac0e0b2a73f16 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:16:19 +0100 Subject: [PATCH 41/60] Yay werkage! --- Connector_RTMP/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 0f777071..173590e1 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -1,4 +1,4 @@ -#define DEBUG +#undef DEBUG #include #include #include @@ -141,8 +141,8 @@ int main(){ SendCTL(3, rec_cnt);//send ack (msg 3) } } - #ifdef DEBUG - fprintf(stderr, "User disconnected.\n"); - #endif + //#ifdef DEBUG + fprintf(stderr, "User %i disconnected.\n", CONN_fd); + //#endif return 0; }//main From ee3973a8c67accdc312a6c2757be15ffcf5cba56 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 02:25:11 +0100 Subject: [PATCH 42/60] New RTMP connector daemon mode --- Connector_RTMP/Conn_RTMP | 58 ++++++++++++++++++++++++++++++++++++++++ Connector_RTMP/Makefile | 10 +++---- Connector_RTMP/main.cpp | 35 +++++++++++++++++++----- Makefile | 15 +++-------- 4 files changed, 95 insertions(+), 23 deletions(-) create mode 100755 Connector_RTMP/Conn_RTMP diff --git a/Connector_RTMP/Conn_RTMP b/Connector_RTMP/Conn_RTMP new file mode 100755 index 00000000..c1686a2f --- /dev/null +++ b/Connector_RTMP/Conn_RTMP @@ -0,0 +1,58 @@ +#!/bin/sh +# +# chkconfig: 345 92 8 +# description: DDVTech RTMP Connector +# +# processname: Connector_RTMP + +. /etc/rc.d/init.d/functions + +prog="Connector_RTMP" +fullprog="/usr/bin/Connector_RTMP" +RETVAL=0 + +start() { + gprintf "Starting %s: " $prog + daemon --user=root $fullprog + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog + return $RETVAL +} + +stop() { + gprintf "Stopping %s: " $prog + killproc $fullprog + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog + return $RETVAL +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + condrestart) + if [ -f /var/lock/subsys/$prog ]; then + stop + start + fi + ;; + status) + status $fullprog + RETVAL=$? + ;; + *) + gprintf "Usage: %s {start|stop|restart|status}" $0 + RETVAL=1 +esac + +exit $RETVAL diff --git a/Connector_RTMP/Makefile b/Connector_RTMP/Makefile index 60d3f086..1edeaee9 100644 --- a/Connector_RTMP/Makefile +++ b/Connector_RTMP/Makefile @@ -16,8 +16,8 @@ $(OUT): $(OBJ) chunkstream.cpp parsechunks.cpp handshake.cpp crypto.cpp amf.cpp $(CC) $(LIBS) -o $(OUT) $(OBJ) clean: rm -rf $(OBJ) $(OUT) Makefile.bak *~ -run-test: $(OUT) - rm -rf ./meh - mkfifo ./meh - cat ./meh & - nc -l -p 1935 -e './Connector_RTMP 2>./meh' +install: $(OUT) + -service Conn_RTMP stop + cp -f ./$(OUT) /usr/bin/ + cp -f ./Conn_RTMP /etc/init.d/ + service Conn_RTMP start diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 173590e1..22c7fc4f 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -22,18 +22,39 @@ int CONN_fd = 0; #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking -int main(){ - int server_socket = DDV_Listen(1935); + +int server_socket = 0; + +void termination_handler (int signum){ + if (server_socket == 0) return; + close(server_socket); + server_socket = 0; +} + +int main(){ + //setup signal handler + struct sigaction new_action; + new_action.sa_handler = termination_handler; + sigemptyset (&new_action.sa_mask); + new_action.sa_flags = 0; + sigaction (SIGINT, &new_action, NULL); + sigaction (SIGHUP, &new_action, NULL); + sigaction (SIGTERM, &new_action, NULL); + + server_socket = DDV_Listen(1935); + if (server_socket > 0){daemon(1, 0);}else{return 1;} int status; while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); CONN_fd = DDV_Accept(server_socket); - pid_t myid = fork(); - if (myid == 0){ - break; - }else{ - printf("Spawned new process %i for handling socket %i\n", (int)myid, CONN_fd); + if (CONN_fd > 0){ + pid_t myid = fork(); + if (myid == 0){ + break; + }else{ + printf("Spawned new process %i for handling socket %i\n", (int)myid, CONN_fd); + } } } if (server_socket <= 0){ diff --git a/Makefile b/Makefile index 8f14fb4b..42ead03d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -default: client-local-install +default: client-install client: cd Connector_HTTP; $(MAKE) @@ -14,18 +14,11 @@ client-clean: cd Buffer; $(MAKE) clean clean: client-clean client-install: client-clean client + service xinetd stop cp -f ./Connector_HTTP/Connector_HTTP /usr/bin/ - cp -f ./Connector_RTMP/Connector_RTMP /usr/bin/ + cd Connector_RTMP; $(MAKE) install cp -f ./Connector_RAW/Connector_RAW /usr/bin/ #cp -f ./Connector_RTSP/Connector_RTSP /usr/bin/ cp -f ./Buffer/Buffer /usr/bin/ cp -f ./PLS /etc/xinetd.d/ - service xinetd restart -client-local-install: client - mkdir -p ./bin - cp -f ./Connector_HTTP/Connector_HTTP ./bin/ - cp -f ./Connector_RTMP/Connector_RTMP ./bin/ - cp -f ./Connector_RAW/Connector_RAW ./bin/ - #cp -f ./Connector_RTSP/Connector_RTSP ./bin/ - cp -f ./Buffer/Buffer ./bin/ - + service xinetd start From c4e1851f4284e21d65177185382bfbfc173070c5 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 02:45:46 +0100 Subject: [PATCH 43/60] Fix voor afsluiten verbinding... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 56e298de..4e1341d2 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -41,7 +41,7 @@ bool DDV_write(void * buffer, int width, int count, int sock){ int todo = width*count; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); - if (r < 0){ + if (r <= 0){ socketError = true; printf("Could not write! %s\n", strerror(errno)); return false; @@ -56,7 +56,7 @@ bool DDV_read(void * buffer, int width, int count, int sock){ int todo = width*count; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); - if (r < 0){ + if (r <= 0){ socketError = true; printf("Could not read! %s\n", strerror(errno)); return false; From 981304acaf05187427399e4405f6f55abe85649a Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 03:12:24 +0100 Subject: [PATCH 44/60] Buffer crash fix --- Buffer/main.cpp | 2 +- util/flv.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index e60cc7ac..e81f80fa 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -60,7 +60,7 @@ int main( int argc, char * argv[] ) { int infile = fileno(stdin); int poller = epoll_create(1); struct epoll_event ev; - ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP; + ev.events = EPOLLIN; ev.data.fd = infile; epoll_ctl(poller, EPOLL_CTL_ADD, infile, &ev); struct epoll_event events[1]; diff --git a/util/flv.cpp b/util/flv.cpp index 44185ffd..c04d977a 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -1,4 +1,5 @@ #include //for read() +#include struct FLV_Pack { int len; @@ -47,6 +48,9 @@ bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar){ //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) bool FLV_GetPacket(FLV_Pack *& p){ + int preflags = fcntl(fileno(stdin), F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(fileno(stdin), F_SETFL, postflags); static bool done = true; static unsigned int sofar = 0; if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} @@ -80,9 +84,11 @@ bool FLV_GetPacket(FLV_Pack *& p){ if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} done = true; sofar = 0; + fcntl(fileno(stdin), F_SETFL, preflags); return true; } } + fcntl(fileno(stdin), F_SETFL, preflags); return false; }//FLV_GetPacket From 206eb006a981539622a037c3859209e5040bb3b5 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 03:19:17 +0100 Subject: [PATCH 45/60] FLV Socket lezer fix --- util/flv_sock.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/util/flv_sock.cpp b/util/flv_sock.cpp index 8d6c55a4..60bc3abe 100644 --- a/util/flv_sock.cpp +++ b/util/flv_sock.cpp @@ -2,17 +2,21 @@ SWBaseSocket::SWBaseError SWBerr; char * FLVbuffer; int FLV_len; int FLVbs = 0; +bool HeaderDone = false; +static char FLVheader[13]; void FLV_Readheader(SWUnixSocket & ss){ - static char header[13]; - while (ss.frecv(header, 13, &SWBerr) != 13){ - //wait - } }//FLV_Readheader void FLV_Dump(){FLV_len = 0;} bool FLV_GetPacket(SWUnixSocket & ss){ + if (!HeaderDone){ + if (ss.frecv(FLVheader, 13, &SWBerr) == 13){HeaderDone = true;} + return false; + } + + if (FLVbs < 15){FLVbuffer = (char*)realloc(FLVbuffer, 15); FLVbs = 15;} //if received a whole header, receive a whole packet //if not, retry header next pass From 2529d5c0f016fb88a5c438e4b05ecb49de36beb9 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:28:56 +0100 Subject: [PATCH 46/60] Nieuwe flv parser, nieuwe unix sockets support... --- Buffer/main.cpp | 4 ++ Connector_RTMP/main.cpp | 49 ++++++++---------- util/ddv_socket.cpp | 52 +++++++++++++++++-- util/flv_sock.cpp | 108 ++++++++++++++++++++++++++++++---------- 4 files changed, 156 insertions(+), 57 deletions(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index e81f80fa..8330108f 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -78,6 +78,10 @@ int main( int argc, char * argv[] ) { metabuffer = (char*)realloc(metabuffer, metabuflen); memcpy(metabuffer, ringbuf[current_buffer]->FLV->data, metabuflen); std::cout << "Received metadata!" << std::endl; + if (gotVideoInfo && gotAudioInfo){ + All_Hell_Broke_Loose = true; + std::cout << "... after proper video and audio? Cancelling broadcast!" << std::endl; + } gotVideoInfo = false; gotAudioInfo = false; } diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 22c7fc4f..f04c6de2 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -10,15 +10,14 @@ #include //for connection to server -#include "../sockets/SocketW.h" bool ready4data = false;//set to true when streaming starts bool inited = false; bool stopparsing = false; timeval lastrec; int CONN_fd = 0; -#include "../util/flv_sock.cpp" //FLV parsing with SocketW #include "../util/ddv_socket.cpp" //DDVTech Socket wrapper +#include "../util/flv_sock.cpp" //FLV parsing with SocketW #include "parsechunks.cpp" //chunkstream parsing #include "handshake.cpp" //handshaking @@ -64,7 +63,8 @@ int main(){ unsigned int ts; unsigned int fts = 0; unsigned int ftst; - SWUnixSocket ss; + int ss; + FLV_Pack * tag; //first timestamp set firsttime = getNowMS(); @@ -98,7 +98,7 @@ int main(){ - while (!socketError){ + while (!socketError && !All_Hell_Broke_Loose){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 0); @@ -108,51 +108,44 @@ int main(){ if (ready4data){ if (!inited){ //we are ready, connect the socket! - if (!ss.connect(streamname.c_str())){ + ss = DDV_OpenUnix(streamname.c_str()); + if (ss <= 0){ #ifdef DEBUG fprintf(stderr, "Could not connect to server!\n"); #endif return 0; } - FLV_Readheader(ss);//read the header, we don't want it #ifdef DEBUG - fprintf(stderr, "Header read, starting to send video data...\n"); + fprintf(stderr, "Everything connected, starting to send video data...\n"); #endif inited = true; } //only send data if previous data has been ACK'ed... if (snd_cnt - snd_window_at < snd_window_size){ - if (FLV_GetPacket(ss)){//able to read a full packet? - ts = FLVbuffer[7] * 256*256*256; - ts += FLVbuffer[4] * 256*256; - ts += FLVbuffer[5] * 256; - ts += FLVbuffer[6]; + if (FLV_GetPacket(tag, ss)){//able to read a full packet? + ts = tag->data[7] * 256*256*256; + ts += tag->data[4] * 256*256; + ts += tag->data[5] * 256; + ts += tag->data[6]; if (ts != 0){ if (fts == 0){fts = ts;ftst = getNowMS();} ts -= fts; - FLVbuffer[7] = ts / (256*256*256); - FLVbuffer[4] = ts / (256*256); - FLVbuffer[5] = ts / 256; - FLVbuffer[6] = ts % 256; + tag->data[7] = ts / (256*256*256); + tag->data[4] = ts / (256*256); + tag->data[5] = ts / 256; + tag->data[6] = ts % 256; ts += ftst; }else{ ftst = getNowMS(); - FLVbuffer[7] = ftst / (256*256*256); - FLVbuffer[4] = ftst / (256*256); - FLVbuffer[5] = ftst / 256; - FLVbuffer[6] = ftst % 256; + tag->data[7] = ftst / (256*256*256); + tag->data[4] = ftst / (256*256); + tag->data[5] = ftst / 256; + tag->data[6] = ftst % 256; } - SendMedia((unsigned char)FLVbuffer[0], (unsigned char *)FLVbuffer+11, FLV_len-15, ts); + SendMedia((unsigned char)tag->data[0], (unsigned char *)tag->data+11, tag->len-15, ts); #ifdef DEBUG fprintf(stderr, "Sent a tag to %i\n", CONN_fd); #endif - FLV_Dump();//dump packet and get ready for next - } - if ((SWBerr != SWBaseSocket::ok) && (SWBerr != SWBaseSocket::notReady)){ - #ifdef DEBUG - fprintf(stderr, "No more data! :-( (%s)\n", SWBerr.get_error().c_str()); - #endif - return 0;//no more input possible! Fail immediately. } } } diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 4e1341d2..caece508 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -1,13 +1,34 @@ #include #include +#include #include #include #include #include #include +#include bool socketError = false; +int DDV_OpenUnix(const char adres[], bool nonblock = false){ + int s = socket(AF_UNIX, SOCK_STREAM, 0); + sockaddr_un addr; + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, adres); + int r = connect(s, (sockaddr*)&adres, sizeof(addr)); + if (r == 0){ + if (nonblock){ + int flags = fcntl(s, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(s, F_SETFL, flags); + } + return s; + }else{ + close(s); + return 0; + } +} + int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); @@ -36,9 +57,8 @@ int DDV_Accept(int sock){ return accept(sock, 0, 0); } -bool DDV_write(void * buffer, int width, int count, int sock){ +bool DDV_write(void * buffer, int todo, int sock){ int sofar = 0; - int todo = width*count; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ @@ -51,9 +71,8 @@ bool DDV_write(void * buffer, int width, int count, int sock){ return true; } -bool DDV_read(void * buffer, int width, int count, int sock){ +bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; - int todo = width*count; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ @@ -65,3 +84,28 @@ bool DDV_read(void * buffer, int width, int count, int sock){ } return true; } + + +bool DDV_read(void * buffer, int width, int count, int sock){return DDV_read(buffer, width*count, sock);} +bool DDV_write(void * buffer, int width, int count, int sock){return DDV_write(buffer, width*count, sock);} + + +int DDV_iwrite(void * buffer, int todo, int sock){ + int r = send(sock, buffer, todo, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } + return r; +} + +int DDV_iread(void * buffer, int todo, int sock){ + int r = recv(sock, buffer, todo, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } + return r; +} + + diff --git a/util/flv_sock.cpp b/util/flv_sock.cpp index 60bc3abe..ac520b43 100644 --- a/util/flv_sock.cpp +++ b/util/flv_sock.cpp @@ -1,34 +1,92 @@ -SWBaseSocket::SWBaseError SWBerr; -char * FLVbuffer; -int FLV_len; -int FLVbs = 0; -bool HeaderDone = false; -static char FLVheader[13]; -void FLV_Readheader(SWUnixSocket & ss){ -}//FLV_Readheader +struct FLV_Pack { + int len; + int buf; + bool isKeyframe; + char * data; +};//FLV_Pack -void FLV_Dump(){FLV_len = 0;} +char FLVHeader[13]; +bool All_Hell_Broke_Loose = false; -bool FLV_GetPacket(SWUnixSocket & ss){ - if (!HeaderDone){ - if (ss.frecv(FLVheader, 13, &SWBerr) == 13){HeaderDone = true;} - return false; - } +//checks FLV Header for correctness +//returns true if everything is alright, false otherwise +bool FLV_Checkheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + if (header[8] != 0x09) return false; + if (header[9] != 0) return false; + if (header[10] != 0) return false; + if (header[11] != 0) return false; + if (header[12] != 0) return false; + return true; +}//FLV_Checkheader - - if (FLVbs < 15){FLVbuffer = (char*)realloc(FLVbuffer, 15); FLVbs = 15;} - //if received a whole header, receive a whole packet - //if not, retry header next pass - if (FLV_len == 0){ - if (ss.frecv(FLVbuffer, 11, &SWBerr) == 11){ - FLV_len = FLVbuffer[3] + 15; - FLV_len += (FLVbuffer[2] << 8); - FLV_len += (FLVbuffer[1] << 16); - if (FLVbs < FLV_len){FLVbuffer = (char*)realloc(FLVbuffer, FLV_len);FLVbs = FLV_len;} +//returns true if header is an FLV header +bool FLV_Isheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + return true; +}//FLV_Isheader + +bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar, int sock){ + if (sofar >= count){return true;} + int r = 0; + r = DDV_iread(buffer + sofar,count-sofar,sock); + if (r < 0){All_Hell_Broke_Loose = true; return false;} + sofar += r; + if (sofar >= count){return true;} + return false; +} + +//gets a packet, storing in given FLV_Pack pointer. +//will assign pointer if null +//resizes FLV_Pack data field bigger if data doesn't fit +// (does not auto-shrink for speed!) +bool FLV_GetPacket(FLV_Pack *& p, int sock){ + int preflags = fcntl(sock, F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(sock, F_SETFL, postflags); + static bool done = true; + static unsigned int sofar = 0; + if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} + if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} + + if (done){ + //read a header + if (ReadUntil(p->data, 11, sofar, sock)){ + //if its a correct FLV header, throw away and read tag header + if (FLV_Isheader(p->data)){ + if (ReadUntil(p->data, 13, sofar, sock)){ + if (FLV_Checkheader(p->data)){ + sofar = 0; + memcpy(FLVHeader, p->data, 13); + }else{All_Hell_Broke_Loose = true;} + } + }else{ + //if a tag header, calculate length and read tag body + p->len = p->data[3] + 15; + p->len += (p->data[2] << 8); + p->len += (p->data[1] << 16); + if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} + done = false; + } } }else{ - if (ss.frecv(FLVbuffer+11, FLV_len-11, &SWBerr) == FLV_len-11){return true;} + //read tag body + if (ReadUntil(p->data, p->len, sofar, sock)){ + //calculate keyframeness, next time read header again, return true + p->isKeyframe = false; + if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + done = true; + sofar = 0; + fcntl(sock, F_SETFL, preflags); + return true; + } } + fcntl(sock, F_SETFL, preflags); return false; }//FLV_GetPacket + From ed9c93395113ec4a9206c269bd573e4a87d4896f Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:32:13 +0100 Subject: [PATCH 47/60] Allow socket reuse --- util/ddv_socket.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index caece508..49f34806 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -12,6 +12,8 @@ bool socketError = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); + int on = 1; + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); From e32cfac71bdbeef71e3fe911f42852c4b208e6e5 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:35:24 +0100 Subject: [PATCH 48/60] Add non daemon mode --- Connector_RTMP/main.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index f04c6de2..a56e8c9d 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -31,7 +31,7 @@ void termination_handler (int signum){ server_socket = 0; } -int main(){ +int main(int argc, char ** argv){ //setup signal handler struct sigaction new_action; new_action.sa_handler = termination_handler; @@ -42,7 +42,9 @@ int main(){ sigaction (SIGTERM, &new_action, NULL); server_socket = DDV_Listen(1935); - if (server_socket > 0){daemon(1, 0);}else{return 1;} + if ((argc < 2) || (argv[1] == "nd")){ + if (server_socket > 0){daemon(1, 0);}else{return 1;} + } int status; while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); From 918002e9bd74d114b18684e782aef85a6ce80695 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:38:20 +0100 Subject: [PATCH 49/60] Debug mode on --- Connector_RTMP/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index a56e8c9d..04c31ebf 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -1,4 +1,4 @@ -#undef DEBUG +#define DEBUG #include #include #include From ac2998ae2864bcb5d373db2906beae57f8a1e509 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:43:01 +0100 Subject: [PATCH 50/60] Connect fux --- util/ddv_socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 49f34806..7f7000aa 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -17,7 +17,7 @@ int DDV_OpenUnix(const char adres[], bool nonblock = false){ sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); - int r = connect(s, (sockaddr*)&adres, sizeof(addr)); + int r = connect(s, (sockaddr*)&addr, sizeof(addr)); if (r == 0){ if (nonblock){ int flags = fcntl(s, F_GETFL, 0); From b34ee4927a87c06c1f53c1857ca4e35806e20dde Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:51:06 +0100 Subject: [PATCH 51/60] DDVSocket edits --- util/ddv_socket.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 7f7000aa..1aa0cad9 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -64,9 +64,15 @@ bool DDV_write(void * buffer, int todo, int sock){ while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ - socketError = true; - printf("Could not write! %s\n", strerror(errno)); - return false; + switch (errno){ + case EWOULDBLOCK: printf("Would block\n"); break; + case EAGAIN: printf("Again\n"); break; + default: + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + break; + } } sofar += r; } @@ -78,9 +84,15 @@ bool DDV_read(void * buffer, int todo, int sock){ while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ - socketError = true; - printf("Could not read! %s\n", strerror(errno)); - return false; + switch (errno){ + case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EAGAIN: printf("Read: Again\n"); break; + default: + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + break; + } } sofar += r; } @@ -96,7 +108,7 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ socketError = true; - printf("Could not write! %s\n", strerror(errno)); + printf("Could not iwrite! %s\n", strerror(errno)); } return r; } @@ -105,7 +117,7 @@ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ socketError = true; - printf("Could not write! %s\n", strerror(errno)); + printf("Could not iread! %s\n", strerror(errno)); } return r; } From 97b37f1004536d67dbbefd285589adb56152d9a2 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:51:34 +0100 Subject: [PATCH 52/60] DDVSocket edits --- util/ddv_socket.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1aa0cad9..19bcab59 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -66,7 +66,6 @@ bool DDV_write(void * buffer, int todo, int sock){ if (r <= 0){ switch (errno){ case EWOULDBLOCK: printf("Would block\n"); break; - case EAGAIN: printf("Again\n"); break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,7 +85,6 @@ bool DDV_read(void * buffer, int todo, int sock){ if (r <= 0){ switch (errno){ case EWOULDBLOCK: printf("Read: Would block\n"); break; - case EAGAIN: printf("Read: Again\n"); break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 72f150aaf6b410de2f7d641404fb70aaf25b4935 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:52:53 +0100 Subject: [PATCH 53/60] DDVSocket edits --- util/ddv_socket.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 19bcab59..23f2de8b 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -105,8 +105,14 @@ bool DDV_write(void * buffer, int width, int count, int sock){return DDV_write(b int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ - socketError = true; - printf("Could not iwrite! %s\n", strerror(errno)); + switch (errno){ + case EWOULDBLOCK: printf("Write: Would block\n"); break; + default: + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + break; + } } return r; } @@ -114,8 +120,14 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ - socketError = true; - printf("Could not iread! %s\n", strerror(errno)); + switch (errno){ + case EWOULDBLOCK: printf("Read: Would block\n"); break; + default: + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + break; + } } return r; } From 708829b5a91931cc29e7081c48683b0a5700bb4d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:56:43 +0100 Subject: [PATCH 54/60] DDVSocket edits --- Connector_RTMP/main.cpp | 2 +- util/ddv_socket.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 04c31ebf..8814d03c 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -48,7 +48,7 @@ int main(int argc, char ** argv){ int status; while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); - CONN_fd = DDV_Accept(server_socket); + CONN_fd = DDV_Accept(server_socket, true); if (CONN_fd > 0){ pid_t myid = fork(); if (myid == 0){ diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 23f2de8b..0c14a371 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -55,8 +55,14 @@ int DDV_Listen(int port){ } } -int DDV_Accept(int sock){ - return accept(sock, 0, 0); +int DDV_Accept(int sock, bool nonblock = false){ + int r = accept(sock, 0, 0); + if ((r > 0) && nonblock){ + int flags = fcntl(r, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(r, F_SETFL, flags); + } + return r; } bool DDV_write(void * buffer, int todo, int sock){ From 3539e95f07998453fb6ec2b63a2c7417aeba9748 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:09:42 +0100 Subject: [PATCH 55/60] DDVSocket edits --- Connector_RTMP/chunkstream.cpp | 4 ++-- util/ddv_socket.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Connector_RTMP/chunkstream.cpp b/Connector_RTMP/chunkstream.cpp index 019118b5..8edf2016 100644 --- a/Connector_RTMP/chunkstream.cpp +++ b/Connector_RTMP/chunkstream.cpp @@ -484,7 +484,7 @@ chunkpack getWholeChunk(){ if (!clean){gwc_complete.data = 0; clean = true;}//prevent brain damage chunkpack * ret = 0; scrubChunk(gwc_complete); - while (counter < 10000){ + while (counter < 1000){ gwc_next = getChunk(); ret = AddChunkPart(gwc_next); scrubChunk(gwc_next); @@ -493,7 +493,7 @@ chunkpack getWholeChunk(){ free(ret);//cleanup returned chunk return gwc_complete; } - if (socketError){break;} + if (socketError || socketBlocking){break;} counter++; } gwc_complete.msg_type_id = 0; diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 0c14a371..1d3efd69 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -9,6 +9,7 @@ #include bool socketError = false; +bool socketBlocking = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); @@ -67,11 +68,12 @@ int DDV_Accept(int sock, bool nonblock = false){ bool DDV_write(void * buffer, int todo, int sock){ int sofar = 0; + socketBlocking = false; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Would block\n"); break; + case EWOULDBLOCK: printf("Would block\n"); socketBlocking = true; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,11 +88,12 @@ bool DDV_write(void * buffer, int todo, int sock){ bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; + socketBlocking = false; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EWOULDBLOCK: printf("Read: Would block\n"); socketBlocking = true; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 5ca0886b6db9370d630937b1a2fc87b76034c6f2 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:12:53 +0100 Subject: [PATCH 56/60] DDVSocket edits --- Connector_RTMP/main.cpp | 2 +- util/ddv_socket.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 8814d03c..f9e81557 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -104,7 +104,7 @@ int main(int argc, char ** argv){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 0); - if ((retval > 0) || (!ready4data || (snd_cnt - snd_window_at >= snd_window_size))){ + if (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)){ parseChunk(); } if (ready4data){ diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1d3efd69..19a6b80e 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -73,7 +73,7 @@ bool DDV_write(void * buffer, int todo, int sock){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Would block\n"); socketBlocking = true; break; + case EWOULDBLOCK: socketBlocking = true; return false; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -93,7 +93,7 @@ bool DDV_read(void * buffer, int todo, int sock){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); socketBlocking = true; break; + case EWOULDBLOCK: socketBlocking = true; return false; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); @@ -115,7 +115,7 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ switch (errno){ - case EWOULDBLOCK: printf("Write: Would block\n"); break; + case EWOULDBLOCK: break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -130,7 +130,7 @@ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EWOULDBLOCK: break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 7ef4d086ff4766373e8bc2b163e52201ebd3647a Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:25:35 +0100 Subject: [PATCH 57/60] DDVSocket edits --- Connector_RTMP/main.cpp | 4 +++- util/ddv_socket.cpp | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index f9e81557..0cef9875 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -105,7 +105,9 @@ int main(int argc, char ** argv){ //rightnow = getNowMS(); retval = epoll_wait(poller, events, 1, 0); if (!ready4data || (snd_cnt - snd_window_at >= snd_window_size)){ - parseChunk(); + if (DDV_ready(CONN_fd)){ + parseChunk(); + } } if (ready4data){ if (!inited){ diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 19a6b80e..43406e4d 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -73,7 +73,7 @@ bool DDV_write(void * buffer, int todo, int sock){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: socketBlocking = true; return false; break; + case EWOULDBLOCK: socketBlocking = true; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,6 +86,12 @@ bool DDV_write(void * buffer, int todo, int sock){ return true; } +bool DDV_ready(int sock){ + char tmp; + int r = recv(sock, &tmp, 1, MSG_PEEK); + return (r == 1); +} + bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; socketBlocking = false; @@ -93,7 +99,7 @@ bool DDV_read(void * buffer, int todo, int sock){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: socketBlocking = true; return false; break; + case EWOULDBLOCK: socketBlocking = true; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 548e6aab95b04ea048f7461439a0a63ffe79f0b0 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:29:06 +0100 Subject: [PATCH 58/60] DDVSocket edits --- Connector_RTMP/main.cpp | 2 +- util/ddv_socket.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 0cef9875..5c2dc8c2 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -48,7 +48,7 @@ int main(int argc, char ** argv){ int status; while (server_socket > 0){ waitpid((pid_t)-1, &status, WNOHANG); - CONN_fd = DDV_Accept(server_socket, true); + CONN_fd = DDV_Accept(server_socket); if (CONN_fd > 0){ pid_t myid = fork(); if (myid == 0){ diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 43406e4d..a1cecf6e 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -88,7 +88,11 @@ bool DDV_write(void * buffer, int todo, int sock){ bool DDV_ready(int sock){ char tmp; + int preflags = fcntl(sock, F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(sock, F_SETFL, postflags); int r = recv(sock, &tmp, 1, MSG_PEEK); + fcntl(sock, F_SETFL, preflags); return (r == 1); } From 31b88fc9d88a9068c64844049e2659201bff586a Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:32:30 +0100 Subject: [PATCH 59/60] DDVSocket edits --- Connector_RTMP/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 5c2dc8c2..87b67b22 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -125,7 +125,7 @@ int main(int argc, char ** argv){ inited = true; } //only send data if previous data has been ACK'ed... - if (snd_cnt - snd_window_at < snd_window_size){ + //if (snd_cnt - snd_window_at < snd_window_size){ if (FLV_GetPacket(tag, ss)){//able to read a full packet? ts = tag->data[7] * 256*256*256; ts += tag->data[4] * 256*256; @@ -151,7 +151,7 @@ int main(int argc, char ** argv){ fprintf(stderr, "Sent a tag to %i\n", CONN_fd); #endif } - } + //} } //send ACK if we received a whole window if (rec_cnt - rec_window_at > rec_window_size){ From fd2783c8defc7cdb712bf86ac69c332f50111d85 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:33:30 +0100 Subject: [PATCH 60/60] DDVSocket edits --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index a1cecf6e..cedcc76c 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -13,8 +13,6 @@ bool socketBlocking = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); - int on = 1; - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); @@ -35,6 +33,8 @@ int DDV_OpenUnix(const char adres[], bool nonblock = false){ int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); + int on = 1; + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port);//port 8888