示例#1
0
        void helper_MessageReceivedEvent(SocketCommunicator helper, object message)
        {
            MessageUpdateDelegate del = ClientMessageReceivedEvent;

            if (del != null)
            {
                del(this, (SocketCommunicatorEx)helper, message);
            }
        }
示例#2
0
        void _messageClient_SendAsyncCompleteEvent(SocketCommunicator helper, SocketCommunicator.AsyncMessageSendInfo info)
        {
            // Message sent to server.
            MessageUpdateDelegate del = MessageUpdateEvent;

            if (del != null)
            {
                del(this, info.Message);
            }
        }
示例#3
0
        void SocketAsyncEventArgs_Received(object sender, SocketAsyncEventArgs e)
        {
#if Matrix_Diagnostics
            if (Monitor.IsReportAllowed)
            {
                Monitor.Info("Socket received: " + e.LastOperation.ToString() + " was " + e.SocketError + " data [" + e.BytesTransferred + "]");
            }
#endif

//            // Do nothing here, since all other places for this cause various problems!
//            if (e.BytesTransferred == 0)
//            {
//#if Matrix_Diagnostics
//                InstanceMonitor monitor = Monitor;
//                if (monitor != null && monitor.IsReportAllowed)
//                {
//                    monitor.Info("Zero bytes transferred.");
//                }
//#endif
//                return;
//            }

            bool resetReceiveArgs = true;
            try
            {
                if (e != _lastReceiveArgs)
                {// We must make sure that we only handle these one at a time.
#if Matrix_Diagnostics
                    Monitor.Fatal("Operation logic error in receive args.");
#endif

                    e.Completed -= new EventHandler <SocketAsyncEventArgs>(SocketAsyncEventArgs_Received);
                    e.Dispose();

                    resetReceiveArgs = false;
                    return;
                }

                if (e.SocketError == SocketError.ConnectionReset

                    /* TODO: THIS WAS ACTIVE, BUT WAS REMOVED SINCE IT CAUSED A PROBLEM IN VALID CONDITIONS
                     * TEST TO SEE IF LINE STILL NEEDED
                     * SO NOW THIS IS MOVED DOWNWARDS.
                     * || e.BytesTransferred == 0*/
                    )
                {// Connection was reset.
#if Matrix_Diagnostics
                    Monitor.ReportImportant("Socket connection reset.");
#endif
                    RaiseDisconnectedEvent();
                    resetReceiveArgs = false;
                    return;
                }

                System.Net.Sockets.Socket socket = _socket;
                if (socket == null)
                {
                    resetReceiveArgs = false;
                    return;
                }

                if (e.SocketError != SocketError.Success || socket.Connected == false)
                {
                    resetReceiveArgs = false;
                    return;
                }

                if (e.BytesTransferred == 0)
                {
                    resetReceiveArgs = false;
                    return;
                }

                lock (_syncRoot)
                {// Start the stream operations.
                    long streamStartPosition = _pendingReceiveStream.Position;

                    _pendingReceiveStream.Seek(0, SeekOrigin.End);
                    _pendingReceiveStream.Write(e.Buffer, 0, e.BytesTransferred);

                    _pendingReceiveStream.Seek(streamStartPosition, SeekOrigin.Begin);
                }

                ISerializer serializer = _serializer;
                if (serializer == null)
                {
                    return;
                }

                object message = null;
                do
                {
                    lock (_syncRoot)
                    {
                        if (_pendingReceiveStream.Length <= _pendingReceiveStream.Position)
                        {// Already read to the end of stream.
                            break;
                        }

                        long startPosition = _pendingReceiveStream.Position;
                        try
                        {
                            message = serializer.Deserialize(_pendingReceiveStream);
                            if (message == null && _pendingReceiveStream.Position != startPosition)
                            {// No message was retrieved, and stream was corrupted.
                                throw new InvalidDataException();
                            }
                        }
                        catch (InvalidDataException ex)
                        {
                            // The serialization routine has failed, or the stream is corrupt;
                            // clear everything and try to start over (error recovery).
                            message = null;
                            _pendingReceiveStream.SetLength(0);
#if Matrix_Diagnostics
                            Monitor.Error("Possible invalid position calculation, data lost.", ex);
#endif
                        }
                    }

                    if (message != null)
                    {
                        if (message is SystemMessage)
                        {// System message received.
                            ProcessSystemMessage(message as SystemMessage);
                        }
                        else
                        {// Custom user message.
                            MessageUpdateDelegate delegateInstance = MessageReceivedEvent;
                            if (delegateInstance != null)
                            {
                                delegateInstance(this, message);
                            }
                        }
                    }
                }while (message != null);


                lock (_syncRoot)
                {
                    if (_pendingReceiveStream.Position == _pendingReceiveStream.Length)
                    {// Reset the receive stream.
                        _pendingReceiveStream.SetLength(0);
                    }
                    else
                    {
                        // Swap primary and secondary streams, copying over the remaining data.
                        MemoryStream existingStream = _pendingReceiveStream;
                        MemoryStream newStream      = _pendingReceiveStreamSecondary;

                        newStream.SetLength(existingStream.Length - existingStream.Position);
                        // Copy the left over data.
                        existingStream.Read(newStream.GetBuffer(), 0, (int)newStream.Length);
                        newStream.Seek(0, SeekOrigin.Begin);

                        CommonHelper.Swap <MemoryStream>(ref _pendingReceiveStream, ref _pendingReceiveStreamSecondary);
                        _pendingReceiveStreamSecondary.SetLength(0);

                        if (existingStream.Position != existingStream.Length)
                        {
#if Matrix_Diagnostics
                            Monitor.Error("Data propagation error.");
#endif
                            throw new SystemException("Data propagation error.");
                        }
                    }
                }
            }
            finally
            {
                // This is crucial, otherwise there is memory leaks.
                //e.Dispose();

                if (resetReceiveArgs)
                {
                    AssignAsyncReceiveArgs(true);
                }
                else
                {
                    ReleaseAsyncReceiveArgs();
                }
            }
        }