我在使用UDPClient编写UDP客服端程序的时候发现一个问题:在创建UDPUDPClient实例的时候我们可以指定一个本地IP地址和端口来绑定,或者让系统自动合理分配。因为是UDP客服端程序,所以我使用后一种方法创建实例。然而在异步接收的时候,我就不知道该怎么设置了,下面是MSDN上面的例子:
public static bool messageReceived = false;public static void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}public static void ReceiveMessages()
{
// Receive a message and write it to the console.
IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
UdpClient u = new UdpClient(e); UdpState s = new UdpState();
s.e = e;
s.u = u; Console.WriteLine("listening for messages");
u.BeginReceive(new AsyncCallback(ReceiveCallback), s); // Do some work while we wait for a message. For this example,
// we'll just sleep
while (!messageReceived)
{
Thread.Sleep(100);
}
}
在调用BeginReceive方法时输入了s参数,s包括了e,u。这是不是要告诉系统只接收e指定的地址和端口? IPAddress.Any可以理解,但是listenPort该怎么指定呢,因为最开始是系统自动分配的端口,我也并不知道啊?另外,根据socket的udp编程,客服端是在调用了sendto函数后再确定了该套接字本地的IP地址和端口号,那UDPClient是不是也sendto调用后确定的呢?谢谢各位了!!
public static bool messageReceived = false;public static void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}public static void ReceiveMessages()
{
// Receive a message and write it to the console.
IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
UdpClient u = new UdpClient(e); UdpState s = new UdpState();
s.e = e;
s.u = u; Console.WriteLine("listening for messages");
u.BeginReceive(new AsyncCallback(ReceiveCallback), s); // Do some work while we wait for a message. For this example,
// we'll just sleep
while (!messageReceived)
{
Thread.Sleep(100);
}
}
在调用BeginReceive方法时输入了s参数,s包括了e,u。这是不是要告诉系统只接收e指定的地址和端口? IPAddress.Any可以理解,但是listenPort该怎么指定呢,因为最开始是系统自动分配的端口,我也并不知道啊?另外,根据socket的udp编程,客服端是在调用了sendto函数后再确定了该套接字本地的IP地址和端口号,那UDPClient是不是也sendto调用后确定的呢?谢谢各位了!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货