From 0e68f770e3e83f22097aacd0e25fa8ea7541cb14 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:56:49 +0100 Subject: [PATCH] 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); +}