socket.BeginReceive的方式在什么时机用?
我在与测试服务器(将接收到的数据发回客户端)建立连接后就创建了一条线程来执行BeginReceive及其回调,
然后我通过BeginSend向测试服务器发送数据后,服务端确认收到并且回发了数据,但是客户端那里却没有收到返回回来的数据
我想知道是森么回事,问题要怎么解决

解决方案 »

  1.   

    客户端用了beginrecive 和beginsend么?有代码贴点出来
      

  2.   

    定义一个ManualResetEvent类型的receiveDone,默认False,在BeginReceive后调用receiveDone.waitOne()阻塞住当前线程,在callback函数里面EndReceive后调用receiveDone.set()方法取消阻塞。http://msdn.microsoft.com/en-us/library/bew39x2a.aspx
      

  3.   

    给你一段我写的代码。有不对的地方欢迎指正!!!!
    public partial class Form1 : Form
        {
            IPAddress myip;
            Socket mysocket;
            NetworkStream constream;
            IPEndPoint myclient;        public static ManualResetEvent handlevenet = new ManualResetEvent(false);        public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {            try
                {
                    myip = IPAddress.Parse(textBox1.Text);
                }
                catch
                {
                    MessageBox.Show("ip错误,请重新输入");
                    return;
                }            try
                {
                    myclient = new IPEndPoint(myip, Int32.Parse(textBox2.Text));
                    mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //while (true)
                    //{
                        handlevenet.Reset();
                        mysocket.BeginConnect(myclient, new AsyncCallback(connectserver), mysocket);
                        handlevenet.WaitOne();
                   // }
                 }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }        }        public void connectserver(IAsyncResult ar)
            {            try
                {
                    Socket client = (Socket)ar.AsyncState;
                    client.EndConnect(ar);
                }
                catch (Exception xx)
                {
                    MessageBox.Show(xx.Message);
                    
                }            try
                {
                    string str="通了,可以通信了";
                    byte[] data = System.Text.Encoding.BigEndianUnicode.GetBytes(str);                mysocket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(senddata), mysocket);                       }
                catch (Exception xxe)
                {
                    MessageBox.Show(xxe.Message);
                }            Thread newthread = new Thread(new ThreadStart(target));
                newthread.Start();            handlevenet.Set(); 
            }        public void target()
            {            byte[] rec=new byte[512];
                mysocket.BeginReceive(rec, 0, rec.Length, SocketFlags.None, new AsyncCallback(recdate), mysocket);
                string ssss=System.Text.Encoding.BigEndianUnicode.GetString(rec);
                MessageBox.Show(ssss); 
            }
            public void recdate(IAsyncResult ar)
            {            Socket clinet = (Socket)ar.AsyncState;
                clinet.EndReceive(ar);
                
     
            }        public void senddata(IAsyncResult ar)
            {            Socket newsocket = (Socket)ar.AsyncState;
                newsocket.EndSend(ar);
     
            }        private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    byte[] senddata1 = System.Text.Encoding.BigEndianUnicode.GetBytes(textBox3.Text);
                    mysocket.BeginSend(senddata1, 0, senddata1.Length, SocketFlags.None, new AsyncCallback(senddata), mysocket);                textBox3.Text = "";
                    
                }
                catch (Exception exxx)
                {
                    MessageBox.Show(exxx.Message);
                }        }        private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                    mysocket.Close();
                }
                catch (Exception xxe)
                {
                    MessageBox.Show(xxe.Message);
                }
            }    }
    }