PuTTy从服务器telnet接收数据,但不接收我的C#程序

时间:2015-02-14 01:16:40

标签: c# .net sockets telnet

我在网络的某个地方有一个示例C#程序(客户端和服务器)。 它在相互通信时工作良好,但是,客户端不工作,我的程序也是如此(当试图通过telnet通过网络从我的微控制器接收数据时)。当我尝试使用PuTTy时,效果非常好。这是我给客户的简短整码。请告诉我该怎么做:)这段代码出了什么问题:

编辑和其他信息: C#程序开始接收数据IF,只要我运行PuTTy。滑稽。当PuTTy连接时,设备似乎只开始向每个客户端抛出数据。

我想得到什么: 恰好在Putty截图中打印的是什么: Q0.00W0.00X0.00Y0.00Z0.00 其中0.00可以是任何值。另请参阅我的C#程序截图。它发送的字符串格式错误:(

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;                                   // Endpoint
using System.Net.Sockets;                           // Socket namespace
using System.Text;                                  // Text encoders

// Declare the delegate prototype to send data back to the form
delegate void AddMessage( string sNewMessage );


namespace ChatClient
{
    /// <summary>
    /// This form connects to a Socket server and Streams data to and from it.
    /// Note: The following has been ommitted.
    ///     1) Send button need to be grayed when conneciton is 
    ///        not active
    ///     2) Send button should gray when no text in the Message box.
    ///     3) Line feeds in the recieved data should be parsed into seperate
    ///        lines in the recieved data list
    ///     4) Read startup setting from a app.config file
    /// </summary>
    public class FormMain : System.Windows.Forms.Form
    {
        // My Attributes
        private Socket          m_sock;                     // Server connection
        private byte []         m_byBuff = new byte[256];   // Recieved data buffer
        private event AddMessage m_AddMessage;              // Add Message Event handler for Form

        // Wizard generated code
        private System.Windows.Forms.Button m_btnConnect;
        private System.Windows.Forms.TextBox m_tbServerAddress;
        private System.Windows.Forms.ListBox m_lbRecievedData;
        private System.Windows.Forms.TextBox m_tbMessage;
        private System.Windows.Forms.Button m_btnSend;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public FormMain()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            // Add Message Event handler for Form decoupling from input thread
            m_AddMessage = new AddMessage( OnAddMessage );


            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.m_tbServerAddress = new System.Windows.Forms.TextBox();
            this.m_tbMessage = new System.Windows.Forms.TextBox();
            this.m_btnConnect = new System.Windows.Forms.Button();
            this.m_lbRecievedData = new System.Windows.Forms.ListBox();
            this.m_btnSend = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // m_tbServerAddress
            // 
            this.m_tbServerAddress.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.m_tbServerAddress.Location = new System.Drawing.Point(8, 8);
            this.m_tbServerAddress.Name = "m_tbServerAddress";
            this.m_tbServerAddress.Size = new System.Drawing.Size(204, 20);
            this.m_tbServerAddress.TabIndex = 1;
            this.m_tbServerAddress.Text = "192.168.0.8";
            // 
            // m_tbMessage
            // 
            this.m_tbMessage.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.m_tbMessage.Location = new System.Drawing.Point(8, 37);
            this.m_tbMessage.Name = "m_tbMessage";
            this.m_tbMessage.Size = new System.Drawing.Size(205, 20);
            this.m_tbMessage.TabIndex = 3;
            this.m_tbMessage.Text = "";
            // 
            // m_btnConnect
            // 
            this.m_btnConnect.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
            this.m_btnConnect.Location = new System.Drawing.Point(228, 8);
            this.m_btnConnect.Name = "m_btnConnect";
            this.m_btnConnect.TabIndex = 0;
            this.m_btnConnect.Text = "Connect";
            this.m_btnConnect.Click += new System.EventHandler(this.m_btnConnect_Click);
            // 
            // m_lbRecievedData
            // 
            this.m_lbRecievedData.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.m_lbRecievedData.IntegralHeight = false;
            this.m_lbRecievedData.Location = new System.Drawing.Point(0, 66);
            this.m_lbRecievedData.Name = "m_lbRecievedData";
            this.m_lbRecievedData.Size = new System.Drawing.Size(311, 220);
            this.m_lbRecievedData.TabIndex = 2;
            // 
            // m_btnSend
            // 
            this.m_btnSend.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
            this.m_btnSend.Location = new System.Drawing.Point(228, 36);
            this.m_btnSend.Name = "m_btnSend";
            this.m_btnSend.TabIndex = 4;
            this.m_btnSend.Text = "Send";
            this.m_btnSend.Click += new System.EventHandler(this.m_btnSend_Click);
            // 
            // FormMain
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(312, 287);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.m_btnSend,
                                                                          this.m_tbMessage,
                                                                          this.m_lbRecievedData,
                                                                          this.m_tbServerAddress,
                                                                          this.m_btnConnect});
            this.Name = "FormMain";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
            this.Text = "Form1";
            this.Closing += new System.ComponentModel.CancelEventHandler(this.FormMain_Closing);
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new FormMain());
        }

        /// <summary>
        /// Connect button pressed. Attempt a connection to the server and 
        /// setup Recieved data callback
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void m_btnConnect_Click(object sender, System.EventArgs e)
        {
            Cursor cursor = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                // Close the socket if it is still open
                if( m_sock != null && m_sock.Connected )
                {
                    m_sock.Shutdown( SocketShutdown.Both );
                    System.Threading.Thread.Sleep( 10 );
                    m_sock.Close();
                }

                // Create the socket object
                m_sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); 

                // Define the Server address and port
                IPEndPoint epServer = new IPEndPoint(  IPAddress.Parse( m_tbServerAddress.Text ), 23 );

                // Connect to the server blocking method and setup callback for recieved data
                // m_sock.Connect( epServer );
                // SetupRecieveCallback( m_sock );

                // Connect to server non-Blocking method
                m_sock.Blocking = false;
                AsyncCallback onconnect = new AsyncCallback( OnConnect );
                m_sock.BeginConnect( epServer, onconnect, m_sock );
            }
            catch( Exception ex )
            {
                MessageBox.Show( this, ex.Message, "Server Connect failed!" );
            }
            Cursor.Current = cursor;
        }

        public void OnConnect( IAsyncResult ar )
        {
            // Socket was the passed in object
            Socket sock = (Socket)ar.AsyncState;

            // Check if we were sucessfull
            try
            {
                //sock.EndConnect( ar );
                if( sock.Connected )
                    SetupRecieveCallback( sock );
                else
                    MessageBox.Show( this, "Unable to connect to remote machine", "Connect Failed!" );
            }
            catch( Exception ex )
            {
                MessageBox.Show( this, ex.Message, "Unusual error during Connect!" );
            }
        }

        /// <summary>
        /// Get the new data and send it out to all other connections. 
        /// Note: If not data was recieved the connection has probably 
        /// died.
        /// </summary>
        /// <param name="ar"></param>
        public void OnRecievedData( IAsyncResult ar )
        {
            // Socket was the passed in object
            Socket sock = (Socket)ar.AsyncState;

            // Check if we got any data
            try
            {
                int nBytesRec = sock.EndReceive( ar );
                if( nBytesRec > 0 )
                {
                    // Wrote the data to the List
                    string sRecieved = Encoding.ASCII.GetString( m_byBuff, 0, nBytesRec );

                    // WARNING : The following line is NOT thread safe. Invoke is
                    // m_lbRecievedData.Items.Add( sRecieved );
                    Invoke( m_AddMessage, new string [] { sRecieved } );

                    // If the connection is still usable restablish the callback
                    SetupRecieveCallback( sock );
                }
                else
                {
                    // If no data was recieved then the connection is probably dead
                    Console.WriteLine( "Client {0}, disconnected", sock.RemoteEndPoint );
                    sock.Shutdown( SocketShutdown.Both );
                    sock.Close();
                }
            }
            catch( Exception ex )
            {
                MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" );
            }
        }

        public void OnAddMessage( string sMessage )
        {
            m_lbRecievedData.Items.Add( sMessage );
        }



        /// <summary>
        /// Setup the callback for recieved data and loss of conneciton
        /// </summary>
        public void SetupRecieveCallback( Socket sock )
        {
            try
            {
                AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
                sock.BeginReceive( m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock );
            }
            catch( Exception ex )
            {
                MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" );
            }
        }

        /// <summary>
        /// Close the Socket connection bofore going home
        /// </summary>
        private void FormMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if( m_sock != null && m_sock.Connected )
            {
                m_sock.Shutdown( SocketShutdown.Both );
                m_sock.Close();
            }
        }

        /// <summary>
        /// Send the Message in the Message area. Only do this if we are connected
        /// </summary>
        private void m_btnSend_Click(object sender, System.EventArgs e)
        {
            // Check we are connected
            if( m_sock == null || !m_sock.Connected )
            {
                MessageBox.Show( this, "Must be connected to Send a message" );
                return;
            }

            // Read the message from the text box and send it
            try
            {       
                // Convert to byte array and send.
                Byte[] byteDateLine = Encoding.ASCII.GetBytes( m_tbMessage.Text.ToCharArray() );
                m_sock.Send( byteDateLine, byteDateLine.Length, 0 );
            }
            catch( Exception ex )
            {
                MessageBox.Show( this, ex.Message, "Send Message Failed!" );
            }
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:1)

好的,解决了!我的微控制器有一定的代码,如果有可用的客户端,它会先检测到。由于我的C#程序只是连接到SERVER(微控制器)并等待接收数据,因此服务器不会将C#程序识别为客户端lol。所以我所做的是,只要我的C#连接到微控制器,它就会先向服务器发送一个特定的字符或字符串,然后它就会开始接收数据。耶!!!

但最后一个问题是如何从richtextbox中获取值(因为我将所有接收到的字符串放入/添加到此rtb中),然后将它们放入5个标签中。