private DoOperationReceiveFrom ( SafeCloseSocket handle, SocketFlags &flags, int &bytesTransferred ) : SocketError | ||
handle | SafeCloseSocket | |
flags | SocketFlags | |
bytesTransferred | int | |
return | SocketError |
public bool ReceiveFromAsync(SocketAsyncEventArgs e) { bool retval; if (s_loggingEnabled) { Logging.Enter(Logging.Sockets, this, "ReceiveFromAsync", ""); } if (CleanedUp) { throw new ObjectDisposedException(GetType().FullName); } if (e == null) { throw new ArgumentNullException("e"); } if (e.RemoteEndPoint == null) { throw new ArgumentNullException("RemoteEndPoint"); } if (!CanTryAddressFamily(e.RemoteEndPoint.AddressFamily)) { throw new ArgumentException(SR.Format(SR.net_InvalidEndPointAddressFamily, e.RemoteEndPoint.AddressFamily, _addressFamily), "RemoteEndPoint"); } // We don't do a CAS demand here because the contents of remoteEP aren't used by // WSARecvFrom; all that matters is that we generate a unique-to-this-call SocketAddress // with the right address family. EndPoint endPointSnapshot = e.RemoteEndPoint; e._socketAddress = SnapshotAndSerialize(ref endPointSnapshot); // DualMode sockets may have updated the endPointSnapshot, and it has to have the same AddressFamily as // e.m_SocketAddres for Create to work later. e.RemoteEndPoint = endPointSnapshot; // Prepare for the native call. e.StartOperationCommon(this); e.StartOperationReceiveFrom(); // Make the native call. SocketFlags flags; int bytesTransferred; SocketError socketError; try { socketError = e.DoOperationReceiveFrom(_handle, out flags, out bytesTransferred); } catch (Exception ex) { // Clear in-use flag on event args object. e.Complete(); throw ex; } // Handle completion when completion port is not posted. if (socketError != SocketError.Success && socketError != SocketError.IOPending) { e.FinishOperationSyncFailure(socketError, bytesTransferred, flags); retval = false; } else { retval = true; } if (s_loggingEnabled) { Logging.Exit(Logging.Sockets, this, "ReceiveFromAsync", retval); } return retval; }