From 5c78296d0eb4941e69f5754551b56995ac76a654 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Fri, 23 Jul 2010 20:13:41 +0200 Subject: [PATCH] Current RTMP status --- RTMP/Connector/main.cpp | 75 +++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 17 deletions(-) diff --git a/RTMP/Connector/main.cpp b/RTMP/Connector/main.cpp index 1de18287..6117604e 100644 --- a/RTMP/Connector/main.cpp +++ b/RTMP/Connector/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include struct Handshake_0 { @@ -19,28 +20,32 @@ struct Handshake_2 { };//Handshake_2 int main( ) { - char blaat; srand( time( NULL ) ); + char next; + char chunk_header[14];//Space to any chunk header imaginable. Basic header max 3, Chunck msg header max 11 + char extended_timestamp[4];//Not always used, so not included in header space. + int chunkIDlenght; + int chunkstream_id; Handshake_0 Client_0; Handshake_1 Client_1; + Handshake_2 Client_2; Handshake_1 Server_1; Handshake_2 Server_2; + /** Start Handshake **/ + + /** Read C0 **/ std::cin >> Client_0.Version; - std::cin >> Client_1.Time; - std::cin >> Client_1.Zero; - std::cin >> Client_1.Random; - Server_1.Time[0] = 0; - Server_1.Time[1] = 0; - Server_1.Time[2] = 0; - Server_1.Time[3] = 4; - Server_1.Zero[0] = 0; - Server_1.Zero[1] = 0; - Server_1.Zero[2] = 0; - Server_1.Zero[3] = 0; - for (int i = 0; i < 1528; i++) { - Server_1.Random[i] = (rand() % 256); - } + /** Read C1 **/ + fread( Client_1.Time, 1, 4, stdin); + fread( Client_1.Zero, 1, 4, stdin); + fread( Client_1.Random, 1, 1528, stdin); + /** Build S1 Packet **/ + Server_1.Time[0] = 0; Server_1.Time[1] = 0; Server_1.Time[2] = 0; Server_1.Time[3] = 4; + Server_1.Zero[0] = 0; Server_1.Zero[1] = 0; Server_1.Zero[2] = 0; Server_1.Zero[3] = 0; + for (int i = 0; i < 1528; i++) { Server_1.Random[i] = (rand() % 256); } + /** Send S0 **/ std::cout << Client_0.Version; + /** Send S1 **/ std::cout << Server_1.Time[0]; std::cout << Server_1.Time[1]; std::cout << Server_1.Time[2]; @@ -52,11 +57,15 @@ int main( ) { for (int i = 0; i < 1528; i++) { std::cout << Server_1.Random[i]; } + /** Flush output, just for certainty **/ + std::cout << std::flush; + /** Build S2 Packet **/ for (int i = 0; i < 4; i++ ) { Server_2.Time[i] = Client_1.Time[i]; Server_2.Time2[i] = Server_2.Time[i]; } Server_2.Time2[3] = Server_2.Time2[3] + 1; + /** Send S2 **/ std::cout << Server_2.Time[0]; std::cout << Server_2.Time[1]; std::cout << Server_2.Time[2]; @@ -68,8 +77,40 @@ int main( ) { for (int i = 0; i < 1528; i++) { std::cout << Client_1.Random[i]; } - while(std::cin.good()) { - std::cin >> blaat; + /** Flush, necessary in order to work **/ + std::cout << std::flush; + /** Read C2 **/ + fread( Client_2.Time, 1, 4, stdin); + fread( Client_2.Time2, 1, 4, stdin); + fread( Client_2.Random_Echo, 1, 1528, stdin); + + /** Handshake done, continue with connect command **/ + + next = std::cin.peek(): + if ((int)next > 63 || (int)next == 2) { exit(1); }//Connect command has a 11 byte header, ALWAYS, maximum value of first byte is then 63 + if ((int)next <= 63 && >= 3) {//1 byte chunkstream ID + fread ( chunk_header, 1, 12, stdin ); + chunkIDlength = 1; + } else if ((int) next == 0 ) {//2 bytes chunkstream ID + fread ( chunk_header, 1, 13, stdin ); + chunkIDlength = 2; + } else if ((int) next == 1 ) {//3 bytes chunkstream ID + fread ( chunk_header, 1, 14, stdin ); + chunkIDlength = 3; } + switch(chunkIDlength) { + case 1: chunkstream_id = (int)chunk_header[0]; break; + case 2: chunkstream_id = (int)chunk_header[1] + 64; break; + case 3: chunkstream_id = ((int)chunk_header[2] * 256) + (int)chunk_header[1] + 64; break; + default; exit(1); break;//Something went wrong + } + + if ( chunk_header[chunkIdlength] == 0xFF && chunk_header[chunkIdlength+1] == 0xFF && chunk_header[chunkIdlength+2] == 0xFF ) { + fread ( extended_timestamp, 1, 4, stdin); //read extended timestamp if 3-byte timestamp equals 0xFFFFFF + } else {//set extended timestamp to 0 + extended_timestamp[0] = 0; extended_timestamp[1] = 0; extended_timestamp[2] = 0; extended_timestamp[3] = 0; + } + + return 0; }