功能要实现发送一串命令行给服务器(硬件),返回我要数据,但是为什么我send后 再receive一直等待阻塞状态。请朋友们帮帮忙。string strMasterHostIP = "192.168.1.254";
            if (TCPIPConnect(strMasterHostIP) == true)
            {
                this.button1.Enabled = false;                Socket m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                int port = Convert.ToInt32(5202);
                string host = strMasterHostIP.ToString();
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                m_Socket.Connect(ipe);
                string s = "7E7E7E03000000061A83005A0D";
                
                byte[] buffer = new byte[s.Length / 2];
                for (int i = 0; i < buffer.Length; i++)
                {
                    buffer[i] = byte.Parse(s.Substring(i * 2, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
                }                try
                {
                    int i = m_Socket.Send(buffer);                    
                    //声明接收返回内容的字符串 
                    string recvStr = "";                    //声明字节数组,一次接收数据的长度为1024字节 
                    byte[] recvBytes = new byte[1024];
                    //返回实际接收内容的字节数 
                    int bytes = 0;
                    //循环读取,直到接收完所有数据 
                    while (true)
                    {
                        bytes = m_Socket.Receive(recvBytes, recvBytes.Length, 0);
                        //读取完成后退出循环 
                        if (bytes <= 0)
                            break;
                    }

解决方案 »

  1.   

    楼上已经说得很清楚 了。
    一般异步方法都会带有Begin或End
    建议用异步。。
      

  2.   

    bytes = m_Socket.Receive(recvBytes, recvBytes.Length, 0);Receive是同步接收的方式。BeginReceive才是异步接收。同步的方式,他一定会等到接收完数据再往下执行。
      

  3.   

    BeginSend 时候 AsyncCallback 也没执行,为什么send不成功?
      

  4.   

    补充下: 我这服务器端是一个电表,命令码十六进制的,我上面那样转byte有问题吗?  
      

  5.   

    其他基本上一样就改了接收
    m_Socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
    byte[] recvBytes = new byte[20];
    m_Socket.BeginReceive(recvBytes, 0, recvBytes.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
            private void OnSend(IAsyncResult ar)
            {
                try
                {
                    m_Socket.EndSend(ar);
                }
                catch (ObjectDisposedException)
                { }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Send: " , MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }        private void OnReceive(IAsyncResult ar)
            {
                try
                {
                    m_Socket.EndReceive(ar);
                     
                }
                catch (ObjectDisposedException)
                { }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Receive: ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
    Send能执行AsyncCallback(OnSend),AsyncCallback(OnReceive) 没有执行
      

  6.   

    你的socket另一端启动socket监听了没有?
    1、服务端启动监听
    2、客户端发起连接请求
    3、服务端接受连接请求,创建连接完毕
    4、客户端发送数据
    5、服务端接收数据。
      

  7.   

    只要使用的是TCP协议,作为服务器端的就必须保持侦听状态,这样客户端才能连接。
    按照你所说的情况,很可能就根本没有正确连接上。另外一种可能就是,对方使用的未必是TCP协议,作为智能电表,很可能使用的是UDP协议。