Telnet不发送数据

时间:2017-03-08 17:28:56

标签: c# telnet

我正在尝试将数据传递到telnet服务器。 我得到了登录凭据的初始提示,但它不会使用用户名。 我需要传递用户名,等待密码提示并输入。 然后能够发送和接收数据,始终保持套接字打开。

我的代码看起来像这样(粗略的,因为我先在控制台中尝试它)

try
            {
                client = new TcpClient("10.0.0.94",23);
                Console.WriteLine("Connected to server.");
            }
            catch (SocketException)
            {
                Console.WriteLine("Failed to connect to server");
                return;
            }

            //Assign networkstream
            NetworkStream networkStream = client.GetStream();


            byte[] data = new byte[1024];
            int size = networkStream.Read(data, 0, data.Length);
            recieved = Encoding.ASCII.GetString(data, 0, size);

            Console.WriteLine(recieved);


            if (recieved.Contains("login"))
            {

                string loginrx;
                string cmd = string.Format("{0}\r",user) ;

                byte[] writeBuffer = Encoding.ASCII.GetBytes(cmd);

                networkStream.Write(writeBuffer, 0, writeBuffer.Length);

                byte[] logindata = new byte[1024];
                int loginsize = networkStream.Read(logindata, 0, logindata.Length);
                loginrx = Encoding.ASCII.GetString(logindata, 0, loginsize);

                Console.WriteLine(loginrx);
                Console.ReadLine();

            }

我收到了登录提示,但一切都停在那里。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

一次发送不等于一次收到。您需要某种方式来告诉您处于“消息的结尾”(可能是换行符)。有关一些学习材料,请参阅Message Framing

您需要查阅telnet协议,但在检查您收到的文本之前,您可能需要继续阅读,直到您阅读新行。您可能希望var sr = new StreamReader(networkStream, Encoding.ASCII)使用sr.ReadLine()来读取字符串,而不是手动调用networkStream.Read并使用Encoding.ASCII.GetString进行解码。

答案 1 :(得分:0)

这就像一个魅力

 while(Connected == false)
            {
                byte[] data = new byte[1024];
                int size = networkStream.Read(data, 0, data.Length);
                recieved = Encoding.ASCII.GetString(data, 0, size);
                Console.WriteLine(recieved);

                 if (recieved.Contains("login"))
                        {
                             login = string.Format("{0}\r\n",user);
                             Console.WriteLine("user request found:{0}", login);
                        }
                 else if (recieved.Contains("password"))
                 {
                     login = string.Format("{0}\r\n",pass);
                     Console.WriteLine("password request found:{0}", login);
                 }
                 else if (recieved.Contains("GNET"))
                 {
                     Console.WriteLine(recieved);
                     Connected = true;
                 }

                 byte[] loginBuffer = Encoding.ASCII.GetBytes(login);

                 networkStream.Write(loginBuffer, 0, loginBuffer.Length);
                 networkStream.Flush();


            }