使用Receive(同步阻塞方式), 注意使用同步方法時,需要使用線程來開始方法,不然會使UI界面卡死
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858); UdpClient udpClient = new UdpClient(RemoteIpEndPoint); while (true) //由於Receive方法是阻塞方法,一個Receive操作完了后才能繼續往下執行,所以能在這里使用死循環 { Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); string msg = Encoding.UTF8.GetString(receiveBytes); }
使用BeginReceive(異步)
private static void InitializeUdpClient()
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858);
UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
//如果這里寫while(true) 則會不停掛起異步接收操作,直到占滿緩沖區間或隊列。會報“由於系統緩沖區空間不足或隊列已滿,不能執行套接字上的操作”的錯
UdpState s = new UdpState(udpClient, RemoteIpEndPoint);
udpClient.BeginReceive(EndReceive, s);
}
private static void EndReceive(IAsyncResult ar)
{
try
{
UdpState s = ar.AsyncState as UdpState;
if (s != null)
{
UdpClient udpClient = s.UdpClient;
IPEndPoint ip = s.IP;
Byte[] receiveBytes = udpClient.EndReceive(ar, ref ip);
string msg = Encoding.UTF8.GetString(receiveBytes);
udpClient.BeginReceive(EndReceive, s);//在這里重新開始一個異步接收,用於處理下一個網絡請求
}
}
catch (Exception ex)
{
//處理異常
}
}
public class UdpState
{
private UdpClient udpclient = null;
public UdpClient UdpClient
{
get { return udpclient; }
}
private IPEndPoint ip;
public IPEndPoint IP
{
get { return ip; }
}
public UdpState(UdpClient udpclient, IPEndPoint ip)
{
this.udpclient = udpclient;
this.ip = ip;
}
}
