Ejemplo n.º 1
0
        internal void Send(OutgoingMessage message)
        {
            var connection = message.MonoConnection;

            if (connection.Sending)
            {
                //TODO: Error
            }
            else
            {
                lock (connection)
                {
                    connection.Sending = true;
                }
            }

            if (message.SendDataBuffer == null)
            {
                message.SendDataBuffer = message.BufferHandle;
            }

            try
            {
                connection.Socket.BeginSend(
                    message.SendDataBuffer,
                    message.SendDataOffset,
                    message.SendDataBytesRemaining,
                    System.Net.Sockets.SocketFlags.None,
                    SendDone,
                    message
                    );
            }
            catch (SocketException)
            {
                Disconnect(connection);

                if (!OutgoingMessagePool.TryPush(message))
                {
                    //TODO: Error
                }
            }
            catch (NullReferenceException)
            {
                // This means that socket was null (connection was already closed)
                // We can just ignore this
            }
        }
Ejemplo n.º 2
0
        void SendDone(IAsyncResult result)
        {
            var message    = (OutgoingMessage)result.AsyncState;
            var connection = message.MonoConnection;

            try
            {
                var bytesTransferred = connection.Socket.EndSend(result);

                message.SendDataBytesRemaining -= bytesTransferred;
                message.SendDataBytesSent      += bytesTransferred;

                if (message.SendDataBytesRemaining > 0)
                {
                    Send(message);
                }
                else
                {
                    if (!OutgoingMessagePool.TryPush(message))
                    {
                        //TODO: Error
                    }

                    lock (connection)
                    {
                        if (connection.SendQueue.Count > 0)
                        {
                            Send(connection.SendQueue.Dequeue());
                        }
                        else
                        {
                            connection.Sending = false;
                        }
                    }
                }
            }
            catch (SocketException)
            {
                Disconnect(connection);

                if (!OutgoingMessagePool.TryPush(message))
                {
                    //TODO: Error
                }
            }
        }
Ejemplo n.º 3
0
        void OnSendComplete(OutgoingMessage message)
        {
            if (message.AsyncArgs.SocketError != SocketError.Success)
            {
                return;
            }

            message.SendDataBytesRemaining -= message.AsyncArgs.BytesTransferred;
            message.SendDataBytesSent      += message.AsyncArgs.BytesTransferred;

            if (message.SendDataBytesRemaining > 0)
            {
                Send(message);
            }
            else
            {
                var connection = message.Win32Connection;

                if (OutgoingMessagePool.TryPush(message))
                {
                    //TODO: Error
                }

                lock (connection)
                {
                    if (connection.SendQueue.Count > 0)
                    {
                        Send(connection.SendQueue.Dequeue());
                    }
                    else
                    {
                        connection.Sending = false;
                    }
                }
            }
        }