C#UDP数据包转发器:重启不起作用

时间:2015-08-21 15:55:12

标签: c# multithreading visual-studio error-handling

长话短说:我需要UDP Packet Repeater / Resender。 它该怎么办? 好吧,它应该监听特定端口上的数据包,并将它们发送回指定端口。 该程序有一个GUI,只有一个按钮,用于运行和关闭程序。

程序工作正常,直到我开始......好好搞定它。

慢慢地我成功地解决了大部分问题。除了一个......或更多:

c# udp socket communication - Only one usage of each socket address (protocol/network address/port) is normally permitted

问题是如果我想重新启动程序,点击按钮我在上面的链接中会得到同样的错误。

我已经尝试过实施Shutdown(),Dispose(),Disconnect(),UDP_Client = null以及可能更多的我已经googeled但它产生了一个新错误,或者没有效果。< / p>

using System;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Packet_Repeater
{
    public partial class Form1 : Form
    {
        public bool connection_status = false;
        UdpClient[]     UDP_Client;
        IPEndPoint[]    IP_End_Point;
        IPAddress[][]   IP_Address;
        Thread[]        Task;
        public int[] upd_client_src_port, udp_client_dst_port;
        public bool[] packet_rxd;
        public bool[] task_running;
        public byte[][] BUFFER;
        public int[,] UDP_Client_num;

    public Form1()
    {
        InitializeComponent();
    }

    public void Init_Size(int num)
    {
        UDP_Client              = new UdpClient[num];
        IP_End_Point            = new IPEndPoint[num];
        IP_Address              = new IPAddress[num][];
        Task                    = new Thread[num];
        upd_client_src_port     = new int[num];
        udp_client_dst_port     = new int[num];
        packet_rxd              = new bool[num];
        BUFFER                  = new byte[num][];
        UDP_Client_num          = new int[num,2];
        task_running            = new bool[num];
    }

    public void UDP_Init(int client_num, string target_ip, int src_port, int dst_port)
    {
        upd_client_src_port[client_num] = src_port;
        udp_client_dst_port[client_num] = dst_port;

        BUFFER[client_num] = new byte[1536];

        if(target_ip == "Any")
        {
            IP_End_Point[client_num] = new IPEndPoint(IPAddress.Any, udp_client_dst_port[client_num]);
        }
        else
        {
            IP_Address[client_num] = Dns.GetHostAddresses(target_ip);
            IP_End_Point[client_num] = new IPEndPoint(IP_Address[client_num][0], udp_client_dst_port[client_num]);
        }
        UDP_Client[client_num] = new UdpClient(upd_client_src_port[client_num]);
        UDP_Client[client_num].Client.SendTimeout       =   500;
        UDP_Client[client_num].Client.ReceiveTimeout    =   500;
    }

    public void Run_Client(int listner_client_num, int destination_client_num)
    {
        task_running[listner_client_num] = true;
        while (connection_status)
        {
            try
            {
                BUFFER[listner_client_num] = UDP_Client[listner_client_num].Receive(ref IP_End_Point[listner_client_num]);
                UDP_Client[destination_client_num].Send(BUFFER[listner_client_num], BUFFER[listner_client_num].Length, IP_End_Point[destination_client_num]);
            }
            catch (Exception) { }
        }
        Array.Clear(BUFFER[listner_client_num], 0, BUFFER[listner_client_num].Length);
// Thread.Sleep(10000);
        UDP_Client[listner_client_num].Close();
        task_running[listner_client_num] = false;
    }

    public void button_Click(object sender, EventArgs e)
    {
        int number_of_connections = 2;

        if(!connection_status)
        {
            button.Enabled = false;
            connection_status = true;

            Init_Size(number_of_connections);

            UDP_Client_num[0, 0] = 0;
            UDP_Client_num[0, 1] = 1;
            UDP_Client_num[1, 0] = 1;
            UDP_Client_num[1, 1] = 0;

            UDP_Init(0, "Any", 9700, 9701);
            UDP_Init(1, "Any", 9600, 9601);
// the Problem is in this for() cycle
            for (UInt32 i = 0; i < (number_of_connections-1); i++)
            {
                Task[i] = new Thread(ThreadStart => Run_Client(UDP_Client_num[i, 0], UDP_Client_num[i, 1]));
                Task[i].Start();
            }
/*   This works OK:
myTask[0] = new Thread(ThreadStart => Run_Client(UDP_Client_num[0, 0], UDP_Client_num[0, 1]));
                myTask[0].Start();

                myTask[1] = new Thread(ThreadStart => Run_Client(UDP_Client_num[1, 0], UDP_Client_num[1, 1]));
                myTask[1].Start();
*/



      button.Text = "Close";
            button.Enabled = true;
        }
        else
        {
            connection_status = false;
            button.Enabled = false;
            for (int i = 0; i < (number_of_connections-1);)
            {
                if(!task_running[i])
                {
                    i++;
                }
            }
            button.Text = "Run";
            button.Enabled = true;
        }
        }
    }
}

如果我在严谨的轨道上,基本上我的UDP客户端没有正确关闭,对吧?

我注意到的另一个奇怪的错误是在Run_Client函数中的while循环之后。 Sleep()命令没有运行。它似乎跳过那一部分。怎么会发生这种情况?

有人可以告诉我在哪里搞砸了吗?

更新: 我一直在寻找系统中的错误,并发现: 浏览时我在命令提示符下找到了这个有用的命令:

netstat -a -b -n- p udp -o

这帮助我发现,其中一个Clinets根本没有关闭。 所以我在开始时和Run_Client()的末尾添加了一个写文本框功能。 出于某种原因,一个Task []将无法启动。所以这被证明是一个线程问题,而不是一个NetSocket。

0 个答案:

没有答案