111,097
社区成员




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
namespace UsbBoxUdpInterface
{
public class UdpReceiver
{
const int c_ReceiveUdpEndPoint = 2112;
bool done = false;
UdpClient listener;
System.Threading.Thread T1;
public UdpReceiver()
{
T1 = new System.Threading.Thread(StartListener);
T1.Start();
}
private void StartListener()
{
try
{
IPHostEntry ipHost = Dns.GetHostEntry("127.0.0.1");
IPAddress ipAddress = ipHost.AddressList[1];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, c_ReceiveUdpEndPoint);
listener = new UdpClient(ipEndPoint);
while (!done)
{
byte[] bytes = listener.Receive(ref ipEndPoint);[/color] string receiveString = Encoding.Default.GetString(bytes, 0, bytes.Length);
MessageEventArgs e = new MessageEventArgs();
e.Message = receiveString;
if (MessageRecieve != null && e.Message != "")
{
MessageRecieve(this, e);
}
}
listener.Close();
}
catch (Exception ex)
{
if (ex.GetType() != typeof(System.Threading.ThreadAbortException))
{
System.Windows.Forms.MessageBox.Show("UdpReceiver StartListener()出错:" + ex.Message);
}
}
}
public event MessageReceivedEventHandle MessageRecieve;
public void Close()
{
done = true;
try
{
T1.Abort();
listener.Close();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("UdpReceiver Close()出错:" + ex.Message);
}
}
}
public delegate void MessageReceivedEventHandle(object Sender, MessageEventArgs e);
public class MessageEventArgs : EventArgs
{
public string Message;
}
}
UdpClient udpClient = (UdpClient)((UdpState)(ar.AsyncState)).udpClient;
IPEndPoint ipendPoint = (IPEndPoint)((UdpState)(ar.AsyncState)).ipEndPoint;
Byte[] receiveBytes = udpClient.EndReceive(ar, ref ipendPoint);
string receiveString = Encoding.Default.GetString(receiveBytes, 0, receiveBytes.Length);
listener.Close();
MessageEventArgs e = new MessageEventArgs();
e.Message = receiveString;
if (MessageRecieve != null && e.Message != "")
{
MessageRecieve(this, e);
}
if (!StopReceive)
{
StartListener();
}
}
否则偶尔会出“不能调用已使用的套接字”错误。using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
namespace UsbBoxUdpInterface
{
public class UdpReceiver
{
const int c_ReceiveUdpEndPoint = 2112;
bool StopReceive = false;
IPEndPoint ipEndPoint;
UdpClient listener;
public UdpReceiver()
{
IPHostEntry ipHost = Dns.GetHostEntry("127.0.0.1");
IPAddress ipAddress = ipHost.AddressList[1];
ipEndPoint = new IPEndPoint(ipAddress, c_ReceiveUdpEndPoint);
StartListener();
}
private void StartListener()
{
listener = new UdpClient(ipEndPoint);
UdpState myUdpState = new UdpState();
myUdpState.udpClient = listener;
myUdpState.ipEndPoint = ipEndPoint;
listener.BeginReceive(new AsyncCallback(ReceiveCallback), myUdpState);
}
}
void ReceiveCallback(IAsyncResult ar)
{
UdpClient udpClient = (UdpClient)((UdpState)(ar.AsyncState)).udpClient;
IPEndPoint ipendPoint = (IPEndPoint)((UdpState)(ar.AsyncState)).ipEndPoint;
Byte[] receiveBytes = udpClient.EndReceive(ar, ref ipendPoint);
string receiveString = Encoding.Default.GetString(receiveBytes, 0, receiveBytes.Length);
MessageEventArgs e = new MessageEventArgs();
e.Message = receiveString;
if (MessageRecieve != null && e.Message != "")
{
MessageRecieve(this, e);
listener.Close();
}
if (!StopReceive)
{
StartListener();
}
}
public event MessageReceivedEventHandle MessageRecieve;
public void Close()
{
StopReceive = true;
}
}
public delegate void MessageReceivedEventHandle(object Sender, MessageEventArgs e);
public class MessageEventArgs : EventArgs
{
public string Message;
}
public class UdpState
{
public UdpClient udpClient;
public IPEndPoint ipEndPoint;
}
}
结贴!谢谢! private void StartListener()
{
try
{
IPHostEntry ipHost = Dns.GetHostEntry("127.0.0.1");
IPAddress ipAddress = ipHost.AddressList[1];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, c_ReceiveUdpEndPoint);
listener = new UdpClient(ipEndPoint);
while (!done)
{
byte[] bytes = listener.Receive(ref ipEndPoint);
string receiveString = Encoding.Default.GetString(bytes, 0, bytes.Length);
if (closeSignal.WaitOne(1000, false))
return;
if (closeSignal.WaitOne(0, false))
return;
MessageEventArgs e = new MessageEventArgs();
e.Message = receiveString;
if (MessageRecieve != null && e.Message != "")
{
MessageRecieve(this, e);
}
}
listener.Close();
}
catch (Exception ex)
{
if (ex.GetType() != typeof(System.Threading.ThreadAbortException))
{
System.Windows.Forms.MessageBox.Show("UdpReceiver StartListener()出错:" + ex.Message);
}
}
}
public void Close()
{
done = true;
try
{
closeSignal.Set();
T1.Join();
//T1.Abort();
//listener.Close();//此名必须放在线程中断后执行,否则出错
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("UdpReceiver Close()出错:" + ex.Message);
}
}
无法响应语句:if (closeSignal.WaitOne(0, false))
return;
麻烦再指导一下,谢谢!