请问大侠,socket的异步处理是不是就是在服务端采用多线程的方式,如果不是 ,多线程与异步处理有哪些区别。

解决方案 »

  1.   

    private void button2_Click(object sender, EventArgs e)
    {
               recvByteBuffer = new byte[1500];        
               string LocalIp = LocalIP.Text.Trim();
               try
               {
                   _multiOpetion = new MulticastOption(IPAddress.Parse("239.255.255.250"),
                                                       IPAddress.Parse(LocalIp));           }
               catch
               {
                   MessageBox.Show("LocalIP error!!!");
               }
              
                string strMSearch = "";
                strMSearch += "M-SEARCH * HTTP/1.1\r\n";
                strMSearch += "Host: 239.255.255.250:1900\r\n";
                strMSearch += "MAN: \"ssdp:discover\"\r\n";
                strMSearch += "MX: 5\r\n";
                strMSearch += "ST: urn:schemas-bmlinks-jp:service:print:1\r\n";
                strMSearch += "RID: uuid:67e36cda-b28d-4ab0-82f7-2a53f71a7169\r\n";
                strMSearch += "ACCEPT-CHARSET: utf-8\r\n";
                strMSearch += "ACCEPT-LANGUAGE: ja,en\r\n\r\n";
            
                try
                {
                    _udpsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(LocalIp), 1901);                _udpsock.Bind(endpoint);                _udpsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);                Byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(strMSearch);                IPEndPoint ipTargetdest = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);                _udpsock.SendTo(sendBytes, ipTargetdest);
                }
                catch (Exception eException)
                {
                    MessageBox.Show(eException.Message, "send error");
                }
            
               IPEndPoint recvep = new IPEndPoint(IPAddress.Any, 1900);
                EndPoint recvip = (EndPoint)recvep;        
                try
                {
                    while (true)
                    {
                        
                        StateObject so2 = new StateObject();
                        so2.mySocket = _udpsock;
                        receiveCallback = new AsyncCallback(ResReceived);                                  
                        _udpsock.BeginReceiveFrom
                            (recvByteBuffer, 0, 1500, SocketFlags.None, ref recvip,
                            receiveCallback, so2);
                          //ResText.Text += recvByteBuffer.ToString();                  
     
                    }                          }
                catch (System.Exception cException)
                {
                    MessageBox.Show(cException.Message, "exception occurred");
                }
                for (int iRcv = 0; iRcv < recvByteBuffer.Length; ++iRcv)
                {
                    if (recvByteBuffer[iRcv] == '\0')
                    {
                        break;
                    }
                    ResText.Text += System.Convert.ToString(System.Convert.ToChar(recvByteBuffer[iRcv]));
                }
            }         
            
            private void ResReceived(IAsyncResult ar)
            {
                StateObject st = (StateObject)ar.AsyncState;            IPEndPoint exp = new IPEndPoint(IPAddress.Any, 1900);
                EndPoint recvep = (EndPoint)exp;
                int recv = 0;
                try
                {
                    recv = st.mySocket.EndReceiveFrom(ar, ref   recvep);
                    
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                if (recv > 0)
                {                //ResText.Text += Encoding.UTF8.GetString(recvByteBuffer, 0, recv);
                    Array.Clear(recvByteBuffer, 0, recvByteBuffer.Length);
                    st.mySocket.BeginReceiveFrom(recvByteBuffer, 0, recvByteBuffer.Length, SocketFlags.None, ref   recvep, receiveCallback, st.mySocket);
                }
                else
                {
                    MessageBox.Show("end ");
                    st.mySocket.Close();
                }
    }
      

  2.   

    看着好像有点问题.那个while(true)不是死循环了,里面还没有break;
      

  3.   

    网上有人做过异步socket写的类,我用这,还不错  TcpCSFramework1.cs