System.Net.Sockets.Socket.EndReceiveMessageFrom C# (CSharp) Method

EndReceiveMessageFrom() public method

public EndReceiveMessageFrom ( IAsyncResult asyncResult, SocketFlags &socketFlags, EndPoint &endPoint, IPPacketInformation &ipPacketInformation ) : int
asyncResult IAsyncResult
socketFlags SocketFlags
endPoint System.Net.EndPoint
ipPacketInformation IPPacketInformation
return int
        public int EndReceiveMessageFrom(IAsyncResult asyncResult, ref SocketFlags socketFlags, ref EndPoint endPoint, out IPPacketInformation ipPacketInformation)
        {
            if (NetEventSource.IsEnabled) NetEventSource.Enter(this, asyncResult);

            if (CleanedUp)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }
            if (endPoint == null)
            {
                throw new ArgumentNullException(nameof(endPoint));
            }
            if (!CanTryAddressFamily(endPoint.AddressFamily))
            {
                throw new ArgumentException(SR.Format(SR.net_InvalidEndPointAddressFamily, endPoint.AddressFamily, _addressFamily), nameof(endPoint));
            }
            if (asyncResult == null)
            {
                throw new ArgumentNullException(nameof(asyncResult));
            }

            ReceiveMessageOverlappedAsyncResult castedAsyncResult = asyncResult as ReceiveMessageOverlappedAsyncResult;
            if (castedAsyncResult == null || castedAsyncResult.AsyncObject != this)
            {
                throw new ArgumentException(SR.net_io_invalidasyncresult, nameof(asyncResult));
            }
            if (castedAsyncResult.EndCalled)
            {
                throw new InvalidOperationException(SR.Format(SR.net_io_invalidendcall, "EndReceiveMessageFrom"));
            }

            Internals.SocketAddress socketAddressOriginal = SnapshotAndSerialize(ref endPoint);

            int bytesTransferred = castedAsyncResult.InternalWaitForCompletionInt32Result();
            castedAsyncResult.EndCalled = true;

            // Update socket address size.
            castedAsyncResult.SocketAddress.InternalSize = castedAsyncResult.GetSocketAddressSize();

            if (!socketAddressOriginal.Equals(castedAsyncResult.SocketAddress))
            {
                try
                {
                    endPoint = endPoint.Create(castedAsyncResult.SocketAddress);
                }
                catch
                {
                }
            }

            if (s_perfCountersEnabled)
            {
                if (bytesTransferred > 0)
                {
                    SocketPerfCounter.Instance.Increment(SocketPerfCounterName.SocketBytesReceived, bytesTransferred);
                    if (Transport == TransportType.Udp)
                    {
                        SocketPerfCounter.Instance.Increment(SocketPerfCounterName.SocketDatagramsReceived);
                    }
                }
            }

            if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"bytesTransferred:{bytesTransferred}");

            // Throw an appropriate SocketException if the native call failed asynchronously.
            if ((SocketError)castedAsyncResult.ErrorCode != SocketError.Success && (SocketError)castedAsyncResult.ErrorCode != SocketError.MessageSize)
            {
                // Update the internal state of this socket according to the error before throwing.
                SocketException socketException = new SocketException(castedAsyncResult.ErrorCode);
                UpdateStatusAfterSocketError(socketException);
                if (NetEventSource.IsEnabled) NetEventSource.Error(this, socketException);
                throw socketException;
            }

            socketFlags = castedAsyncResult.SocketFlags;
            ipPacketInformation = castedAsyncResult.IPPacketInformation;

            if (NetEventSource.IsEnabled) NetEventSource.Exit(this, bytesTransferred);
            return bytesTransferred;
        }

Usage Example

示例#1
0
        public static Task <SocketReceiveMessageFromResult> ReceiveMessageFromAsync(
            this Socket socket,
            ArraySegment <byte> buffer,
            SocketFlags socketFlags,
            EndPoint remoteEndPoint)
        {
            return(Task <SocketReceiveMessageFromResult> .Factory.FromAsync(
                       (callback, state) => socket.BeginReceiveMessageFrom(
                           buffer.Array,
                           buffer.Offset,
                           buffer.Count,
                           socketFlags,
                           ref remoteEndPoint,
                           callback,
                           state),
                       asyncResult => {
                IPPacketInformation ipPacket;
                int bytesReceived = socket.EndReceiveMessageFrom(
                    asyncResult,
                    ref socketFlags,
                    ref remoteEndPoint,
                    out ipPacket);

                return new SocketReceiveMessageFromResult()
                {
                    PacketInformation = ipPacket,
                    ReceivedBytes = bytesReceived,
                    RemoteEndPoint = remoteEndPoint,
                    SocketFlags = socketFlags
                };
            },
                       null));
        }
All Usage Examples Of System.Net.Sockets.Socket::EndReceiveMessageFrom