长话短说:我需要UDP Packet Repeater / Resender。 它该怎么办? 好吧,它应该监听特定端口上的数据包,并将它们发送回指定端口。 该程序有一个GUI,只有一个按钮,用于运行和关闭程序。
程序工作正常,直到我开始......好好搞定它。
慢慢地我成功地解决了大部分问题。除了一个......或更多:
问题是如果我想重新启动程序,点击按钮我在上面的链接中会得到同样的错误。
我已经尝试过实施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。