2006-01-09 Robert Jordan <robertj@gmx.net>
authorRobert Jordan <robertj@gmx.net>
Tue, 9 Jan 2007 00:22:40 +0000 (00:22 -0000)
committerRobert Jordan <robertj@gmx.net>
Tue, 9 Jan 2007 00:22:40 +0000 (00:22 -0000)
* TcpServerChannel.cs (ProcessMessages): Flush the stream only when
necessary (TcpServerTransportSink.InternalProcessMessage does it anyway),
otherwise pending OneWay & async messages are lost.
* TcpMessageIO.cs (SendMessageStream): Mark OneWay messages as such.
Fixes MS.NET interoperability.
* TcpClientTransportSink.cs (AsyncProcessRequest):
Use the new TcpMessageIO.SendMessageStream overload to mark OneWay
requests. Fixes bug #80406.

svn path=/trunk/mcs/; revision=70685

mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/ChangeLog
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpMessageIO.cs
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs

index dd0d3ffed84f0f165920b8ba03de2c4bd5fb4315..146c910fb3e369304806f0a825ec6b78ef2971fd 100644 (file)
@@ -1,3 +1,14 @@
+2006-01-09  Robert Jordan  <robertj@gmx.net>
+
+       * TcpServerChannel.cs (ProcessMessages): Flush the stream only when
+       necessary (TcpServerTransportSink.InternalProcessMessage does it anyway),
+       otherwise pending OneWay & async messages are lost.
+       * TcpMessageIO.cs (SendMessageStream): Mark OneWay messages as such.
+       Fixes MS.NET interoperability.
+       * TcpClientTransportSink.cs (AsyncProcessRequest):
+       Use the new TcpMessageIO.SendMessageStream overload to mark OneWay
+       requests. Fixes bug #80406.
+
 2007-01-08  Lluis Sanchez Gual  <lluis@novell.com>
 
        * TcpChannel.cs, TcpServerChannel.cs: Moved StartListening call to
index ddd08e6a8bf598f65b511a84818abb9b2a122e10..e31e286424eceebb7f8925418026a95c7f6cc825 100644 (file)
@@ -81,7 +81,7 @@ namespace System.Runtime.Remoting.Channels.Tcp
                                // response of the server
 
                                connection = TcpConnectionPool.GetConnection (_host, _port);
-                               TcpMessageIO.SendMessageStream (connection.Stream, requestStream, headers, connection.Buffer);
+                               TcpMessageIO.SendMessageStream (connection.Stream, requestStream, headers, connection.Buffer, isOneWay);
                                connection.Stream.Flush ();
 
                                if (!isOneWay) 
index 29e6575accd60bc36e2abea4bb99d96ad75ef893..58c6b079ec481f45cf8400af557057d5406ab8cf 100644 (file)
@@ -96,6 +96,11 @@ namespace System.Runtime.Remoting.Channels.Tcp
                }
 
                public static void SendMessageStream (Stream networkStream, Stream data, ITransportHeaders requestHeaders, byte[] buffer)
+               {
+                       SendMessageStream (networkStream, data, requestHeaders, buffer, false);
+               }
+
+               public static void SendMessageStream (Stream networkStream, Stream data, ITransportHeaders requestHeaders, byte[] buffer, bool isOneWay)
                {
                        if (buffer == null) buffer = new byte[DefaultStreamBufferSize];
 
@@ -103,9 +108,16 @@ namespace System.Runtime.Remoting.Channels.Tcp
                        byte[] dotnetHeader = _msgHeaders[(int) MessageStatus.MethodMessage];
                        networkStream.Write(dotnetHeader, 0, dotnetHeader.Length);
 
-                       // Writes header tag (0x0000 if request stream, 0x0002 if response stream)
-                       if(requestHeaders[CommonTransportKeys.RequestUri]!=null) buffer [0] = (byte) 0;
-                       else buffer[0] = (byte) 2;
+                       // Writes the header tag
+                       // 0x0000 - request stream
+                       // 0x0001 - OneWay request stream
+                       // 0x0002 - response stream
+                       if(requestHeaders[CommonTransportKeys.RequestUri]!=null) {
+                               buffer [0] = isOneWay ? (byte) 1 : (byte) 0;
+                       }
+                       else {
+                               buffer[0] = (byte) 2;
+                       }
                        buffer [1] = (byte) 0 ;
 
                        // Writes ID
index a923251538bf7661c3f6767a1f88593576f8e9d1..c0025003aeeb7b9d2a5e6ba576dbf9a9d121146a 100644 (file)
@@ -324,10 +324,10 @@ namespace System.Runtime.Remoting.Channels.Tcp
 
                                                case MessageStatus.Unknown:
                                                case MessageStatus.CancelSignal:
+                                                       _stream.Flush ();
                                                        end = true;
                                                        break;
                                        }
-                                       _stream.Flush ();
                                }
                        }
                        catch (Exception ex)