System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess C# (CSharp) Method

FinishOperationSuccess() private method

private FinishOperationSuccess ( SocketError socketError, int bytesTransferred, SocketFlags flags ) : void
socketError SocketError
bytesTransferred int
flags SocketFlags
return void
        internal void FinishOperationSuccess(SocketError socketError, int bytesTransferred, SocketFlags flags)
        {
            SetResults(socketError, bytesTransferred, flags);

            switch (_completedOperation)
            {
                case SocketAsyncOperation.Accept:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, false);
                        }
                    }

                    // Get the endpoint.
                    Internals.SocketAddress remoteSocketAddress = IPEndPointExtensions.Serialize(_currentSocket._rightEndPoint);

                    socketError = FinishOperationAccept(remoteSocketAddress);

                    if (socketError == SocketError.Success)
                    {
                        _acceptSocket = _currentSocket.UpdateAcceptSocket(_acceptSocket, _currentSocket._rightEndPoint.Create(remoteSocketAddress));

                        if (NetEventSource.IsEnabled) NetEventSource.Accepted(_acceptSocket, _acceptSocket.RemoteEndPoint, _acceptSocket.LocalEndPoint);
                    }
                    else
                    {
                        SetResults(socketError, bytesTransferred, SocketFlags.None);
                        _acceptSocket = null;
                    }
                    break;

                case SocketAsyncOperation.Connect:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, true);
                        }
                    }

                    socketError = FinishOperationConnect();

                    // Mark socket connected.
                    if (socketError == SocketError.Success)
                    {
                        if (NetEventSource.IsEnabled) NetEventSource.Connected(_currentSocket, _currentSocket.LocalEndPoint, _currentSocket.RemoteEndPoint);

                        _currentSocket.SetToConnected();
                        _connectSocket = _currentSocket;
                    }
                    break;

                case SocketAsyncOperation.Disconnect:
                    _currentSocket.SetToDisconnected();
                    _currentSocket._remoteEndPoint = null;

                    break;

                case SocketAsyncOperation.Receive:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, false);
                        }
                    }
                    break;

                case SocketAsyncOperation.ReceiveFrom:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, false);
                        }
                    }

                    // Deal with incoming address.
                    _socketAddress.InternalSize = GetSocketAddressSize();
                    Internals.SocketAddress socketAddressOriginal = IPEndPointExtensions.Serialize(_remoteEndPoint);
                    if (!socketAddressOriginal.Equals(_socketAddress))
                    {
                        try
                        {
                            _remoteEndPoint = _remoteEndPoint.Create(_socketAddress);
                        }
                        catch
                        {
                        }
                    }
                    break;

                case SocketAsyncOperation.ReceiveMessageFrom:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, false);
                        }
                    }

                    // Deal with incoming address.
                    _socketAddress.InternalSize = GetSocketAddressSize();
                    socketAddressOriginal = IPEndPointExtensions.Serialize(_remoteEndPoint);
                    if (!socketAddressOriginal.Equals(_socketAddress))
                    {
                        try
                        {
                            _remoteEndPoint = _remoteEndPoint.Create(_socketAddress);
                        }
                        catch
                        {
                        }
                    }

                    FinishOperationReceiveMessageFrom();
                    break;

                case SocketAsyncOperation.Send:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, true);
                        }
                    }
                    break;

                case SocketAsyncOperation.SendPackets:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogSendPacketsBuffers(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, true);
                        }
                    }

                    FinishOperationSendPackets();
                    break;

                case SocketAsyncOperation.SendTo:
                    if (bytesTransferred > 0)
                    {
                        // Log and Perf counters.
                        if (NetEventSource.IsEnabled)
                        {
                            LogBuffer(bytesTransferred);
                        }
                        if (Socket.s_perfCountersEnabled)
                        {
                            UpdatePerfCounters(bytesTransferred, true);
                        }
                    }
                    break;
            }

            if (socketError != SocketError.Success)
            {
                // Asynchronous failure or something went wrong after async success.
                SetResults(socketError, bytesTransferred, flags);
                _currentSocket.UpdateStatusAfterSocketError(socketError);
            }

            // Complete the operation and raise completion event.
            Complete();
            if (_context == null)
            {
                OnCompleted(this);
            }
            else
            {
                ExecutionContext.Run(_context, s_executionCallback, this);
            }
        }
    }

Usage Example

Example #1
0
        //
        // SendPacketsAsync
        // 
        public bool SendPacketsAsync(SocketAsyncEventArgs e) {

            bool retval;

            if(s_LoggingEnabled) Logging.Enter(Logging.Sockets, this, "SendPacketsAsync", "");

            // Throw if socket disposed
            if(CleanedUp) {
                throw new ObjectDisposedException(GetType().FullName);
            }

            // Throw if not connected.
            if(!Connected) {
                throw new NotSupportedException(SR.GetString(SR.net_notconnected));
            }

            // Prepare for the native call.
            e.StartOperationCommon(this);
            e.StartOperationSendPackets();
            BindToCompletionPort();

            // Make the native call.
            SocketError socketError;
            bool result;

            if (e.m_SendPacketsDescriptor.Length > 0) {
                try {
                    result = TransmitPackets(
                                m_Handle, 
                                e.m_PtrSendPacketsDescriptor,
                                e.m_SendPacketsDescriptor.Length, 
                                e.m_SendPacketsSendSize,
                                e.m_PtrNativeOverlapped, 
                                e.m_SendPacketsFlags); 
                }
               catch(Exception) {
                    // clear in-use on event arg object 
                    e.Complete();
                    throw;
                }

                if(!result) {
                    socketError = (SocketError)Marshal.GetLastWin32Error();
                } else {
                    socketError = SocketError.Success;
                }

                // Handle completion when completion port is not posted.
                if(socketError != SocketError.Success && socketError != SocketError.IOPending) {
                    e.FinishOperationSyncFailure(socketError, 0, SocketFlags.None);
                    retval = false;
                } else {
                    retval = true;
                }
            }
            else {
                // No buffers or files to send.
                e.FinishOperationSuccess(SocketError.Success, 0, SocketFlags.None);
                retval = false;
            }


            if(s_LoggingEnabled) Logging.Exit(Logging.Sockets, this, "SendPacketsAsync", retval);

            return retval;
        }
All Usage Examples Of System.Net.Sockets.SocketAsyncEventArgs::FinishOperationSuccess
SocketAsyncEventArgs