要做个局域网通信的小东西,可有好多疑问。
有几个问题想不明白,问下大家。非常感谢。
1、UDPClient类和Socket类有什么区别,看别人说了很多,可就想不明白,再次问下。
2、使用UDPClient类通信时,是否要知道对方IP。
3、这是从别人提供的代码中的一句话,看不明白。
            //得到本机IP,设置端口号         
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
   那个IPAddress.Any做什么用的。
4、两个用户要通信,怎么确定是要和对方通信,这个和第二个问题差不多吧。C#还没有入门,好多理论的道理都没想明白,希望大家解释下,别打击我。还没有什么没说清楚的我再补充。再次感谢。

解决方案 »

  1.   


    那么怎么获得对方IP呢,不是说UDP是无连接的嘛?这个无连接和对方IP怎么理解。
    谢谢。
      

  2.   

    tcp是可靠的,需要确定数据顺利传输,而udp是不可靠的,把数据送出去就不管了
    就跟一个是挂号信需要签名,表明送到,一个是平信,送出去就不管你能否收到,也许在门口信箱就别别人拿走了...
      

  3.   

    第三个问题:IPAddress.Any表明不是针对某一固定ip监听,而是对网络上的虽有ip都是开放的
    第四个问题:服务器端有监听,客户端知道服务器IP后发送连接请求,服务器端通过请求,连接之后,就可以互通信息了
      

  4.   


    这个或许没说明白,我是说Socket和UDPClient的区别,好像他们都是Socket,可以这么理解嘛?
    谢谢你了。
      

  5.   

    socket可以选择多种协议进行传输,包括tcp,udp,ftp
    这里的UDPClient其实就是一个指定了使用udp协议的socket客户端而已,是socket使用的一种方式之一
      

  6.   

    Udp的广播模式下不需要知道对方的IP,指定IPAddress.Any就可以了,等于是一个在网络上发udp数据包,任何节点都可以接收。
    UdpClient是包装了socket的udp同步方式,简化了程序的编写,但是如果要用udp异步操作,就得用socket,因为udpclient不支持。这是我知道的udpclient和socket的主要区别。
      

  7.   

    贴上一段在udp广播模式下,异步接收数据的代码:
       private string[] ipaddrs = new string[50];
       private int[] isOpen = new int[50];
       private Thread capture;
       private byte[] tbuffer = null;
       private IPEndPoint udpremotepoint = new IPEndPoint(IPAddress.Any, 0);
       private IPEndPoint udplocalpoint = null;
       private static ManualResetEvent m_evtListen = new ManualResetEvent(false);
       private Socket udpserver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);        public void beginReceive() 
            {
                    IPHostEntry iphostentry = Dns.GetHostByName(Dns.GetHostName());
                    if (iphostentry.AddressList.Length > 0)
                    {
                        IPAddress localaddress = iphostentry.AddressList[0];
                        udplocalpoint = new IPEndPoint(localaddress, 8080);
                    }
                    udplocal = (EndPoint)udplocalpoint;
                    udpremote = (EndPoint)udpremotepoint;
                    udpserver.Bind(udplocal);
                    capture = new Thread(new ThreadStart(CaptureThread));
                    capture.Start();
               }        private void CaptureThread()
            {
                //while (udpclient != null && Thread.CurrentThread.ThreadState.Equals(System.Threading.ThreadState.Running))
                while (Thread.CurrentThread.ThreadState.Equals(System.Threading.ThreadState.Running))
                {
                        m_evtListen.Reset();
                        tbuffer = null;
                        tbuffer = new byte[2048];
                        tbTest.Text = "";
                        udpserver.BeginReceiveFrom(tbuffer, 0, SocketState.BufferSize, SocketFlags.None, ref udpremote, new AsyncCallback(UdpRecCallback), udpserver);
                        
                        m_evtListen.WaitOne(); //确认连接上了再继续
                 }
            private void UdpRecCallback(IAsyncResult ar)
            {
                m_evtListen.Set();//通知主线程继续            Socket server = (Socket)ar.AsyncState;            //tbTest.Text = "";
                try
                {
                    int bytes = server.EndReceiveFrom(ar, ref udpremote);
                    if (bytes > 0)
                    {
                        string data = Encoding.UTF8.GetString(tbuffer, 0, bytes);
                        //对接收到的数据进行处理
                           
      这里SocketState是个自定义的类:
            private class SocketState
            {
                public Socket worksocket = null;            public const int BufferSize = 2048;            public byte[] bytes = new byte[BufferSize];
            }                      
    如果是用同步方式,在CaptureThread()方法里用一句byte[] recBytes = udpclient.Receive(ref udpremotePoint);就可以了,不需要UdpRecCallback方法和SocketState类,多线程也不需要,简单了许多。
      

  8.   

    不好意思,最近一忙给忘结贴了。
    谢谢 paulin 和 hzzasdf