<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2800.1595" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2>Hi, <BR>is MONO network streaming 
slow?</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>First I built a very simple client/server program 
<BR>to get a data stream over network.<BR>In both programs I used a 
TcpClient,<BR>a NetworkStream and a byte array (8kB chunks)<BR>to stream 20 MB 
of data.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Then I tested the transfer rate of the 
client/server<BR>program between different Linux/MONO (1.2.3.1) <BR>and 
different Windows/.NET (2.0) hosts<BR>in a 100 Mbit/s ethernet.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>The strange result: If MONO was involved <BR>the 
speed was dramatically reduced.<BR>Only a .NET/.NET transfer showed a 
realistic<BR>rate.&nbsp; </FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>.NET --&gt; MONO : 31...42 Mbit/s&nbsp;&nbsp; 
LOW<BR>MONO --&gt; MONO : 43...45 Mbit/s&nbsp;&nbsp; LOW<BR>MONO --&gt; .NET : 
51...76 Mbit/s&nbsp;&nbsp; LOW<BR>.NET --&gt; .NET : 94 
Mbit/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O.K.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>What's wrong here?</FONT></DIV>
<DIV><SPAN class=335492907-18062007><FONT face=Arial size=2>Any suggestions or 
hints?</FONT></SPAN></DIV>
<DIV><SPAN class=335492907-18062007><FONT face=Arial size=2>Thanks in 
advance.</FONT></SPAN></DIV>
<DIV><SPAN class=335492907-18062007><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=335492907-18062007><FONT face=Arial 
size=2>Cheers</FONT></SPAN></DIV>
<DIV><SPAN class=335492907-18062007><FONT face=Arial 
size=2>Andreas</FONT></SPAN></DIV><FONT face=Arial size=2>
<DIV><BR>=======================================================</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>Sourcecodes:</DIV>
<DIV>&nbsp;</DIV>
<DIV>// ******<BR>// Client<BR>// ******</DIV>
<DIV>&nbsp;</DIV>
<DIV>using System;<BR>using System.IO;<BR>using System.Net.Sockets;</DIV>
<DIV>&nbsp;</DIV>
<DIV>namespace SimpleStreamClient<BR>{<BR>&nbsp; class 
SimpleStreamClient<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; public static void 
Main(string[] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TcpClient 
client;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetworkStream 
netStream;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buf = new 
byte[8192];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesToReceive = 
buf.Length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int receivedBytes = 
0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesReceived = 0;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int index = 0; index &lt; 10; index++) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = new TcpClient(args[0], 
14866);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netStream = 
client.GetStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime 
startTime = DateTime.Now;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bytesReceived = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesToReceive = 
buf.Length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(bytesToReceive 
&gt; 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
receivedBytes = netStream.Read(buf, 0, 
bytesToReceive);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if(receivedBytes == 0) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bytesReceived += 
receivedBytes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bytesToReceive -= 
receivedBytes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(receivedBytes == 
0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double rate = bytesReceived / 
(((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds * 1000) * 
8;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(bytesReceived 
+ " Bytes received (" + rate + "MBit/s).");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp; Console.ReadKey();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; 
}<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>// ******<BR>// Server<BR>// ******</DIV>
<DIV>&nbsp;</DIV>
<DIV>using System;<BR>using System.IO;<BR>using System.Net;<BR>using 
System.Net.Sockets;</DIV>
<DIV>&nbsp;</DIV>
<DIV>namespace SimpleStreamServer<BR>{<BR>&nbsp; class 
SimpleStreamServer<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; public static void 
Main(string[] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TcpClient 
client;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetworkStream 
netStream;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bigBuf = new 
byte[20000000];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoryStream ms = new 
MemoryStream(bigBuf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buf = new 
byte[8192];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string host = 
Dns.GetHostEntry(args[0]).AddressList[0].ToString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
IPAddress ipAddr = IPAddress.Parse(host);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
TcpListener listener = new TcpListener(ipAddr, 
14866);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
listener.Start();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Waiting for 
client ...");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = 
listener.AcceptTcpClient();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("New 
client!");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netStream = 
client.GetStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Seek(0, 
SeekOrigin.Begin);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int readBytes = 
0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((readBytes = ms.Read(buf, 
0, buf.Length)) != 0) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netStream.Write(buf, 
0, readBytes);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
netStream.Flush();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
client.Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp; }<BR>}<BR></FONT></DIV></BODY></HTML>