Exemplo n.º 1
0
 internal static extern unsafe bool TransmitFile(
     SafeHandle socket,
     SafeHandle fileHandle,
     int numberOfBytesToWrite,
     int numberOfBytesPerSend,
     SafeHandle overlapped,
     TransmitFileBuffers* buffers,
     TransmitFileOptions flags);
Exemplo n.º 2
0
        //
        // SetUnmanagedStructures -
        // Fills in Overlapped Structures used in an Async Overlapped Winsock call
        //   these calls are outside the runtime and are unmanaged code, so we need
        //   to prepare specific structures and ints that lie in unmanaged memory
        //   since the Overlapped calls can be Async
        //
        internal void SetUnmanagedStructures(byte[] preBuffer, byte[] postBuffer, FileStream fileStream, TransmitFileOptions flags, bool sync)
        {
            //
            // fill in flags if we use it.
            //
            m_fileStream = fileStream;
            m_flags      = flags;

            //
            // Fill in Buffer Array structure that will be used for our send/recv Buffer
            //
            m_buffers = null;
            int buffsNumber = 0;

            if (preBuffer != null && preBuffer.Length > 0)
            {
                ++buffsNumber;
            }

            if (postBuffer != null && postBuffer.Length > 0)
            {
                ++buffsNumber;
            }

            object[] objectsToPin = null;
            if (buffsNumber != 0)
            {
                ++buffsNumber;
                objectsToPin = new object[buffsNumber];

                m_buffers = new TransmitFileBuffers();

                objectsToPin[--buffsNumber] = m_buffers;

                if (preBuffer != null && preBuffer.Length > 0)
                {
                    m_buffers.preBufferLength   = preBuffer.Length;
                    objectsToPin[--buffsNumber] = preBuffer;
                }

                if (postBuffer != null && postBuffer.Length > 0)
                {
                    m_buffers.postBufferLength  = postBuffer.Length;
                    objectsToPin[--buffsNumber] = postBuffer;
                }

                if (sync)
                {
                    base.PinUnmanagedObjects(objectsToPin);
                }
                else
                {
                    base.SetUnmanagedStructures(objectsToPin);
                }

                if (preBuffer != null && preBuffer.Length > 0)
                {
                    m_buffers.preBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(preBuffer, 0);
                }

                if (postBuffer != null && postBuffer.Length > 0)
                {
                    m_buffers.postBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(postBuffer, 0);
                }
            }
            else if (!sync)
            {
                base.SetUnmanagedStructures(null);
            }
        } // SetUnmanagedStructures()