예제 #1
0
        /// <summary>
        /// Sends the current buffer using data_buffer as the source of data. The size
        /// is determined from the position in outputBuff.
        /// </summary>
        /// <param name="header">The header to prepend to the amf packet.</param>
        private void chunkBufferAndSend(AMFHeader header)
        {
            //the size remaining in the data buffer
            int size = (int)outputBuff.Position;

            //the position in the data buffer (from which to start sending bytes)
            int position = 0;

            //reset the chunkBuff position
            chunkBuff.Position = 0;

            //write the header to the chunk buffer
            header.writeHeader(chunkBuff);

            //copy <= 128 bytes from the data buffer into the chunk buffer to send.
            Array.Copy(dataBuffer, 0, chunk_buffer, header.getHeaderSize(),
                size > 128 ? 128 : size);
            //send the first packet of information
            connectionSocket.Send(chunk_buffer,
                (header.getHeaderSize() + (size > 128 ? 128 : size)),
                SocketFlags.None);

            size -= 128;
            position += 128;


            while (size > 0)
            {
                //add a header byte
                dataBuffer[position - 1] = header.get_1_HeaderByte();

                //send out the data
                connectionSocket.Send(dataBuffer, position - 1,
                    size > 128 ? 129 : size + 1, SocketFlags.None);

                

                position += 128;
                size -= 128;
            }
        }
예제 #2
0
        public void rtmptConnect(string[] c_params)
        {

            PersistantHTTPConnection connection = new PersistantHTTPConnection(sParams.ServerURL,
                sParams.Port);

      
            
            req = (HttpWebRequest)WebRequest.Create(
                "http://" + sParams.ServerURL + ":" + sParams.Port + "/send/" + clientIndex + "/" + pollCount
            );
            req.ContentType = "application/x-fcs";
            req.Method = "POST";
            req.KeepAlive = true;

            //using the client index connect to the application
            AMFHeader header = new AMFHeader(AMFHeader.HEADER_12, 0x3);
            header.EndPoint = 0;
            header.TimeStamp = 1;
            header.RTMPType = AMFHeader.RTMP_TYPE_FUNCTION;
            header.BodySize = 0;

            requestStream = req.GetRequestStream();
           

            //write the method name (connect);
            AMFString aString = new AMFString("connect");
            aString.write(buffer);
            buffer.Write(reserved1, 0, reserved1.Length);

            AMFObject aConnParams = new AMFObject();
            aConnParams.addParameter("app", new AMFString(sParams.ApplicationName));
            aConnParams.addParameter("flashVer", new AMFString("WIN 8,0,24,0"));
            aConnParams.addParameter("swfUrl", new AMFString("xfile://c:\\swfurl.swf"));
            aConnParams.addParameter("tcUrl", new AMFString("rtmp://" + sParams.ServerURL + "/" + sParams.ApplicationName));
            aConnParams.addParameter("fpad", new AMFBoolean(false));
            aConnParams.addParameter("name", new AMFString("ePresence"));

            aConnParams.write(buffer);

            foreach (string s in c_params)
            {
                new AMFString(s).write(buffer);
            }

            header.BodySize = (int)buffer.Position;
            Console.Write(header.BodySize);
            header.writeHeader(requestStream);
            requestStream.Write(buffer.GetBuffer(), 0, (int)buffer.Position);

 
            resp = (HttpWebResponse)req.GetResponse();
            responseReader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
            Console.WriteLine(responseReader.ReadToEnd());


        }
예제 #3
0
        /// <summary>
        /// Sends the flv tag to the RTMP server.
        /// </summary>
        /// <param name="tagData"></param>
        /// <param name="tag"></param>
        public override bool sendFLVTag(byte[] tagData, FLVTag tag)
        {
      
            if (!isConnected)
                return false;
            outputBuff.Position = 0;
            chunkBuff.Position = 0;

            AMFHeader header = new AMFHeader(AMFHeader.HEADER_12, 0x8);
            header.RTMPType = AMFHeader.RTMP_TYPE_VIDEO;
            header.TimeStamp = tag.TimeStamp;
            header.EndPoint = 0x00000001;
            header.BodySize = tag.getTagSizeInBytes() - 11;

            //write the header to teh chunkbuffer
            header.writeHeader(chunkBuff);

            //the size remaining in the data buffer
            int size = tag.getTagSizeInBytes() - 11;

            //the position in the data buffer (from which to start sending bytes)
            int position = 0;

            //write the header to the chunk buffer
            header.writeHeader(chunkBuff);

            //copy <= 128 bytes from the tagData into the chunk buffer to send.
            Array.Copy(tagData, 11, chunk_buffer, header.getHeaderSize(),
                size > 128 ? 128 : size);
            //send the first packet of information
            connectionSocket.Send(chunk_buffer,
                (header.getHeaderSize() + (size > 128 ? 128 : size)),
                SocketFlags.None);

            size -= 128;
            position += 128 + 11;

            //while there is still bytes
            while (size > 0)
            {

                //add a header byte
                byte t = tagData[position - 1];
                tagData[position - 1] = header.get_1_HeaderByte();

                //send out the data
                connectionSocket.Send(tagData, position - 1,
                    size > 128 ? 129 : size + 1, SocketFlags.None);
                

                //restore where the header was
                tagData[position - 1] = t;
                position += 128;
                size -= 128;

            }

            return true;

        }