UDP未接收更新的值

时间:2015-08-17 17:32:06

标签: c# c#-4.0 .net-4.0 udp udpclient

我的udp类未从流中接收更新的值。设备连续发送数据,当任何警报激活时,它会在流中添加代码并发送更新的值,但我的类没有收到更新的值,除非我重新启动程序。

这是我的UDPListener课程。

public class 
{
    public static int PORT_NUMBER { get; set; }
    public string IpAddress { get; set; }
    private readonly UdpClient udp;
    public event Action<object, EventArgs> msgChanged;
    IAsyncResult ar_ = null;

    public UDPListener(string ipaddr, int port)
    {
        IpAddress = ipaddr;
        PORT_NUMBER = port;
        udp = new UdpClient(PORT_NUMBER);
        Start();
    }

    public void Start()
    {
        StartListening();
    }

    public void Stop()
    {
        try
        {
            udp.Close();
        }
        catch { /* not necessary */ }
    }

    private void StartListening()
    {
        ar_ = udp.BeginReceive(Receive, new object());
    }

    private void Receive(IAsyncResult ar)
    {
        try
        {
            Thread.Sleep(150);
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(IpAddress), PORT_NUMBER);
            byte[] bytes = udp.EndReceive(ar, ref ip);
            string message = Encoding.ASCII.GetString(bytes);

            //raise event..
            if (message.StartsWith("S"))
                if (msgChanged != null)
                    msgChanged(message, EventArgs.Empty);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Error in UDPListner..." + ex.Message);
        }
        finally
        {
            StartListening();
        }
    }
}

现在程序启动时会发生什么,它将接收数据&#34; S0000 ..&#34;但是当警报将数据更改提升为&#34; S8000..etc&#34;但是这个班级不断收到相同的&#34; S000 ..&#34;数据,除非我重新开始上课。

当我在while循环中运行udp监听器时,它工作得很好,它接收更新的流并在闹钟响起时更改。

这是while循环udp的代码。

while (!StopRunning)
{
    Thread.Sleep(150);
    udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork);
    var ep = default(IPEndPoint);
    var data = udp.Receive(ref ep);
    udp.Close();
    string msg = Encoding.ASCII.GetString(data);
    if (msgChanged != null)
        msgChanged(msg, EventArgs.Empty);
}

但我无法使用while循环,因为我必须在窗口服务中使用此程序。

1 个答案:

答案 0 :(得分:0)

您的UDPListener和while循环的主要区别在于,每次连接到UDP时,您都在循环中创建udp变量:

 udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork);

Receive(IAsyncResult ar)中,您只能连接同一个客户端,因此您仍然拥有相同的数据 我认为你可以改写你的课程:

private void StartListening()
{
    udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork);
    ar_ = udp.BeginReceive(Receive, new object());
}

使用Close()方法收到后,请确保您是disposing the udp connection

byte[] bytes = udp.EndReceive(ar, ref ip);
udp.Close();