void helper_MessageReceivedEvent(SocketCommunicator helper, object message) { MessageUpdateDelegate del = ClientMessageReceivedEvent; if (del != null) { del(this, (SocketCommunicatorEx)helper, message); } }
void _messageClient_SendAsyncCompleteEvent(SocketCommunicator helper, SocketCommunicator.AsyncMessageSendInfo info) { // Message sent to server. MessageUpdateDelegate del = MessageUpdateEvent; if (del != null) { del(this, info.Message); } }
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(); } } }