private DoOperationReceiveMessageFrom ( Socket socket, SafeCloseSocket handle, int &bytesTransferred ) : SocketError | ||
socket | Socket | |
handle | SafeCloseSocket | |
bytesTransferred | int | |
리턴 | SocketError |
public bool ReceiveMessageFromAsync(SocketAsyncEventArgs e) { bool retval; if (s_loggingEnabled) { Logging.Enter(Logging.Sockets, this, "ReceiveMessageFromAsync", ""); } 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 // WSARecvMsg; 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 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; SetReceivingPacketInformation(); // Prepare for the native call. e.StartOperationCommon(this); e.StartOperationReceiveMessageFrom(); // Make the native call. int bytesTransferred; SocketError socketError; try { socketError = e.DoOperationReceiveMessageFrom(this, _handle, 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, SocketFlags.None); retval = false; } else { retval = true; } if (s_loggingEnabled) { Logging.Exit(Logging.Sockets, this, "ReceiveMessageFromAsync", retval); } return retval; }