public void StartOperation(OperationType operationType, byte[] buffer) { InProgress = true; Success = false; OperationType = operationType; if (buffer != null) { if (m_pinnedBuffer == null) { m_pinnedBuffer = new PinnedBuffer(buffer); } else if (m_pinnedBuffer.Buffer != buffer) { m_pinnedBuffer.Switch(buffer); } } }
public override void Receive(byte[] buffer, int offset, int count, SocketFlags flags) { if (buffer == null) { throw new ArgumentNullException("buffer"); } if (m_receivePinnedBuffer == null) { m_receivePinnedBuffer = new PinnedBuffer(buffer); } else if (m_receivePinnedBuffer.Buffer != buffer) { m_receivePinnedBuffer.Switch(buffer); } m_inOverlapped.StartOperation(OperationType.Receive); m_receiveWSABuffer.Pointer = new IntPtr(m_receivePinnedBuffer.Address + offset); m_receiveWSABuffer.Length = count; int bytesTransferred; SocketError socketError = UnsafeMethods.WSARecv(Handle, ref m_receiveWSABuffer, 1, out bytesTransferred, ref flags, m_inOverlapped.Address, IntPtr.Zero); if (socketError != SocketError.Success) { socketError = (SocketError)Marshal.GetLastWin32Error(); if (socketError != SocketError.IOPending) { throw new SocketException((int)socketError); } } }