472,142 Members | 1,366 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,142 software developers and data experts.

Socket.Send is slow when sending within same process

There is two examples of code.

Example 1. Send and Receive within the same process. Put this code in a
console app called SendAndReceive and run the code.

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
SocketReceive sr = new SocketReceive();
Thread tsr = new Thread(new ThreadStart(sr.Process));
tsr.IsBackground = true;
tsr.Start();

SocketSend ss = new SocketSend();
Thread tss = new Thread(new ThreadStart(ss.Process));
tss.IsBackground = true;
tss.Start();

while (tsr.IsAlive || tss.IsAlive)
{
Thread.Sleep(100);
}
}
}

class SocketSend
{
public void Process()
{
// Register the socket
IPEndPoint endPoint = new
IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 7001);

Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.IP);
try
{
int max = 600000;
socket.Connect(endPoint);
long start = start = DateTime.Now.Ticks; ;
long time1 = 0;
int completed = 0;
for (int i = 0; i <= max; i++)
{
if ((i % 1000) == 0)
Console.WriteLine("Sending {0}", i);
SendLiteMessage(socket, i);
completed++;
time1 = DateTime.Now.Ticks;
if (((time1 - start) / 10000) 1000)
{
Console.WriteLine("Sent {0} in {1}(ms)", completed,
((time1 - start) / 10000));
start = DateTime.Now.Ticks;
completed = 0;
}
}
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}

private void SendLiteMessage(Socket socket, int count)
{
byte[] bas = new byte[2048];
bas[0] = (byte)count;

long start = start = DateTime.Now.Ticks; ;
socket.Send(bas, SocketFlags.None);
long time1 = DateTime.Now.Ticks;
//Console.WriteLine("Socket Send took {0}", (time1 - start));
}

}

class SocketReceive
{
private object ReceiveMessageLite(NetworkStream ns, int count)
{
byte[] bas = new byte[2048];
int read = ns.Read(bas, 0, bas.Length);
return bas;
}

public void Process()
{
IPEndPoint endPoint = new
IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 7001);
try
{
Console.WriteLine("Waiting for Sender...");
TcpListener listener = new TcpListener(endPoint.Address,
7001);

listener.Start();
TcpClient client = listener.AcceptTcpClient();
client.ReceiveBufferSize = 32768;
NetworkStream ns = client.GetStream();
long start = start = DateTime.Now.Ticks; ;
long time1 = 0;
int completed = 0;
for (int i = 0; i < 600000; i++)
{
if ((i % 1000) == 0)
Console.WriteLine("Receiving {0}", i);

object obj = ReceiveMessageLite(ns, i);
completed++;
time1 = DateTime.Now.Ticks;
if (((time1 - start) / 10000) 1000)
{
Console.WriteLine("Received {0} in {1}(ms)",
completed, ((time1 - start) / 10000));
start = DateTime.Now.Ticks;
completed = 0;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
}
}
}

Example 2. Put this code in a console app called Receive
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
SocketReceive sr = new SocketReceive();
Thread tsr = new Thread(new ThreadStart(sr.Process));
tsr.IsBackground = true;
tsr.Start();

while (tsr.IsAlive)
{
Thread.Sleep(100);
}
}
}

class SocketReceive
{
private object ReceiveMessageLite(NetworkStream ns, int count)
{
byte[] bas = new byte[2048];
int read = ns.Read(bas, 0, bas.Length);
return bas;
}

public void Process()
{
IPEndPoint endPoint = new
IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 7001);
try
{
Console.WriteLine("Waiting for Sender...");
TcpListener listener = new TcpListener(endPoint.Address,
7001);

listener.Start();
TcpClient client = listener.AcceptTcpClient();
client.ReceiveBufferSize = 32768;
NetworkStream ns = client.GetStream();
long start = start = DateTime.Now.Ticks; ;
long time1 = 0;
int completed = 0;
for (int i = 0; i < 600000; i++)
{
if ((i % 1000) == 0)
Console.WriteLine("Receiving {0}", i);

object obj = ReceiveMessageLite(ns, i);
completed++;
time1 = DateTime.Now.Ticks;
if (((time1 - start) / 10000) 1000)
{
Console.WriteLine("Received {0} in {1}(ms)",
completed, ((time1 - start) / 10000));
start = DateTime.Now.Ticks;
completed = 0;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
}
}
}
Example 2. Put this code in a console app called Send.
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
SocketSend ss = new SocketSend();
Thread tss = new Thread(new ThreadStart(ss.Process));
tss.IsBackground = true;
tss.Start();

while (tss.IsAlive)
{
Thread.Sleep(100);
}
}
}

class SocketSend
{
public void Process()
{
// Register the socket
IPEndPoint endPoint = new
IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 7001);

Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.IP);
try
{
int max = 600000;
socket.Connect(endPoint);
long start = start = DateTime.Now.Ticks; ;
long time1 = 0;
int completed = 0;
for (int i = 0; i <= max; i++)
{
if ((i % 1000) == 0)
Console.WriteLine("Sending {0}", i);
SendLiteMessage(socket, i);
completed++;
time1 = DateTime.Now.Ticks;
if (((time1 - start) / 10000) 1000)
{
Console.WriteLine("Sent {0} in {1}(ms)", completed,
((time1 - start) / 10000));
start = DateTime.Now.Ticks;
completed = 0;
}
}
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}

private void SendLiteMessage(Socket socket, int count)
{
byte[] bas = new byte[2048];
bas[0] = (byte)count;

long start = start = DateTime.Now.Ticks; ;
socket.Send(bas, SocketFlags.None);
long time1 = DateTime.Now.Ticks;
//Console.WriteLine("Socket Send took {0}", (time1 - start));
}

}

}

Run Receive and then Send. Compare the received about with Example 1 you
will see example 2 will be quicker.

Let me know your outcome.

Thanks,
Oct 6 '06 #1
0 2881

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Robert A. van Ginkel | last post: by
5 posts views Thread by John Sheppard | last post: by
5 posts views Thread by kuba bogaczewicz | last post: by
2 posts views Thread by Nuno Magalhaes | last post: by
2 posts views Thread by linuxfedora | last post: by
2 posts views Thread by manasap | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.