278 lines · 8.4 KB · C#
RawDownload
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms; namespace NetworkThrouputTool{    public partial class Main : Form    {        private TcpListener m_server;        private TcpClient client;        private int packetSize;        private System.Threading.Timer timer;        private delegate void SafeCallDelegate(Result result);         public Main()        {            InitializeComponent();         }         private void button4_Click(object sender, EventArgs e)        {            startSending();        }          private void SendData(object state)        {            try            {                Random rand = new Random();                 byte[] data = new byte[packetSize];                rand.NextBytes(data);                Buffer.BlockCopy(BitConverter.GetBytes(packetSize), 0, data, 0, 4);                 Stopwatch stopWatch = new Stopwatch();                 stopWatch.Reset();                 stopWatch.Start();                 NetworkStream stream = client.GetStream();                stream.Write(data, 0, data.Length);                 stopWatch.Stop();                   Result result = new Result()                {                    Size = packetSize,                    Type = "Sent",                    Time = stopWatch.ElapsedTicks / 10000.0D,                    Speed = Convert.ToDouble(packetSize) / (stopWatch.ElapsedTicks / 10000.0D)                };                 var d = new SafeCallDelegate(AppendRow);                this.listView1.Invoke(d, result);            }            catch (Exception ex)            {                MessageBox.Show($"Can not send package to Server. Message: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);            }        }         private void button1_Click(object sender, EventArgs e)        {            try            {                IPAddress localAddr = IPAddress.Any;                int port = Convert.ToInt32(textBoxServerPort.Text);                m_server = new TcpListener(localAddr, port);                m_server.Start();                button1.Enabled = false;                button2.Enabled = true;                 m_server.BeginAcceptTcpClient(new AsyncCallback(AccepConnection), m_server);            }            catch (Exception ex)            {                MessageBox.Show($"Can not start Server. Message: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);            }        }         private void button2_Click(object sender, EventArgs e)        {            m_server.Stop();            button1.Enabled = true;            button2.Enabled = false;        }         // Process the client connection.        public void AccepConnection(IAsyncResult ar)        {            try            {                // Get the listener that handles the client request.                TcpListener listener = (TcpListener)ar.AsyncState;                 // End the operation and display the received data on                 // the console.                TcpClient client = listener.EndAcceptTcpClient(ar);                                NetworkStream stream = client.GetStream();                Stopwatch stopWatch = new Stopwatch();                stopWatch.Reset();                                 Byte[] hbuffer = new Byte[4]; // 4 Byte buffer for size                Byte[] buffer = new Byte[1024]; // 8 Byte buffer for size                                                                  while (client.Connected)                {                    int actualReadBytes = stream.Read(hbuffer, 0, hbuffer.Length);                    int size = BitConverter.ToInt32(hbuffer, 0);                                         stopWatch.Start();                     while (actualReadBytes < size)                    {                        actualReadBytes = actualReadBytes + stream.Read(buffer, 0, Math.Min(buffer.Length,size - actualReadBytes));                    }                    stopWatch.Stop();                     var d = new SafeCallDelegate(AppendRow);                     m_server.BeginAcceptTcpClient(new AsyncCallback(AccepConnection), m_server);                     Result result = new Result()                    {                        Size = size,                        Type = "Recieved",                        Time = stopWatch.ElapsedTicks / 10000.0D,                        Speed = size / (stopWatch.ElapsedTicks / 10000.0D)                    };                    this.listView1.Invoke(d, result);                     stopWatch.Reset();                }            }            catch            {            }        }         private void AppendRow(Result result)        {            ListViewItem it = new ListViewItem(result.Type);                        it.SubItems.Add(result.Size.ToString());            it.SubItems.Add(result.Time.ToString());            it.SubItems.Add(result.Speed.ToString());            this.listView1.Items.Add(it);        }         private class Result        {            public int Size;            public string Type;            public double Time;            public double Speed;         }         private void button3_Click(object sender, EventArgs e)        {            this.listView1.Clear();        }         private void export2File()        {            string filename = "";            SaveFileDialog sfd = new SaveFileDialog();             sfd.Title = "Export Results";            sfd.Filter = "Text File (.csv) | *.csv";             if (sfd.ShowDialog() == DialogResult.OK)            {                filename = sfd.FileName.ToString();                if (filename != "")                {                    using (StreamWriter sw = new StreamWriter(filename))                    {                        sw.WriteLine("{0},{1},{2},{3}", "Type", "Size (B)","Time (ms)","Speed (KB/s)");                         foreach (ListViewItem item in this.listView1.Items)                        {                            sw.WriteLine("{0},{1},{2},{3}", item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text);                        }                    }                }            }        }         private void button5_Click(object sender, EventArgs e)        {            export2File();        }         private void button6_Click(object sender, EventArgs e)        {            stopSending();        }          private void stopSending()        {            try            {                timer.Change(Timeout.Infinite, Timeout.Infinite);                NetworkStream stream = client.GetStream();                stream.Close();                client.Close();            }            finally            {                button4.Enabled = true;                button6.Enabled = false;                textBoxPacketSize.Enabled = true;                textBoxClientHost.Enabled = true;                textBoxClientPort.Enabled = true;            }                    }         private void startSending()        {            try            {                Random rand = new Random();                packetSize = Convert.ToInt32(textBoxPacketSize.Text);                 if (packetSize < 8)                {                    MessageBox.Show("Please specify a packetsize > 8B", "Invalid PacketSize", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }                 int port = Convert.ToInt32(textBoxClientPort.Text);                string host = textBoxClientHost.Text;                 client = new TcpClient(host, port);                 timer = new System.Threading.Timer(SendData, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));                 button6.Enabled = true;                button4.Enabled = false;                textBoxPacketSize.Enabled = false;                textBoxClientHost.Enabled = false;                textBoxClientPort.Enabled = false;             }            catch (Exception ex)            {                MessageBox.Show($"Can not connect to Server. Message: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);            }        }    } }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t