UdpClient.Receive返回值只是个byte[].
而UdpClient.Client.RemoteEndPoint给的提示是:"由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。"如果说UDP无法获取远程主机网络信息的话,那么MSDN上关于UdpClient.Receive 方法 的介绍中有一句:"如果在 Connect 方法中指定了默认远程主机,则 Receive 方法将只接受来自该主机的数据报。其他所有数据报将被丢弃。"
那.net又是怎么区分包是不是Connect的默认远程主机发来的.问了几个用JAVA的人,他们说可以获得,因为他们用的Socket.Receive得到的是一个包是一个对象,我们用到的数据byte[]只是该对象的一个属性.

解决方案 »

  1.   

    哎! 什么人都有,破坏CSDN的环境.....
      

  2.   

    IPEndPoint endpoint = null;
    var data = this.EndReceive(handler, ref endpoint);
      

  3.   

    this可以替换为你的的UdpClient。因为我从其继承,并封装了扩展功能,所以写为this。
      

  4.   

    嗯,如果是同步Receive,获取endpoint的方法可能是叫做ReceiveFrom才对,使用方法是一样的——使用ref关键字。
      

  5.   

    没有ReceiveFrom方法,但是我仔细看MSDN发现Receive的参数""""""""""""""""""""""""""""""""
    public byte[] Receive (
    ref IPEndPoint remoteEP
    )
    参数
    remoteEP
    一个 IPEndPoint,它表示从其发送数据的远程主机。
    """""""""""""""""""""""""""""""""以前我一直是以为是本地的IPEndPoint呢! 我每次都是把本地IP和端口new IPEndPoint一个作为参数用的.
    都怪我看书不仔细呀,幸好急时发现,要不然以后乱用问题大了.
    以前在一个项目上要用到组播,我把组播地址和端口号new一个IPEndPoint对象做全局变量,Receive的参数用了它(现在知道了是Receive后改为远程主机了),我说怎么Receive后再Send就异常,还以为是组播只能单向呢,所以就另用一个端口号和IPEndPoint对象做为接收专用.非常感谢!