1
我的udp
類未接收到來自流的更新值。設備不斷髮送數據,當任何警報激活時,它將代碼添加到流中併發送更新後的值,但我的班級沒有收到更新的值,除非我重新啓動程序。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();
}
}
}
什麼是現在的程序啓動時,它會接收數據時發生的「S0000 ..」但是,當報警提高數據變爲「S8000..etc」,但這個類連續接收相同的「S000 ..」數據除非我重新開課。
當我在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循環,因爲我必須在窗口服務中使用這個程序。
兩個問題。首先,在異步回調中'Thread.Sleep'的目的是什麼?其次,你確定回調實際上是多次執行嗎?當發送者發送「S8000」時,您的客戶似乎不太可能收到「S0000」。 –
另請參閱http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient一個簡單的UDP接收器。 –
我只是添加thread.sleep來給予150毫秒的中斷,因爲這我開始接收準確的數據。我已經看到你的意見在答案http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient和基於這些建議我已經刪除Thread.sleep並調用BeginReceive權限後收到,但其工作真的快速和在數據處理過程中記錄爲空字符串,但數據實際上進來了! – dawncode