14

这是直截了当的吗?有人有什么好的例子吗?我所有的谷歌搜索都返回了关于如何在 dotNet 中制作 telnet 客户端的项目,但这对我来说太过分了。我正在尝试在 C# 中执行此操作。

谢谢!

4

2 回答 2

13

C# 2.0 和 Telnet - 不像听起来那么痛苦
http://geekswithblogs.net/bigpapa/archive/2007/10/08/C-2.0-and-Telnet---Not-As-Painful-As-It.aspx

或者这个替代链接

如果您要使用 System.Net.Sockets 类,请执行以下操作:

  • 创建一个 IPEndpoint,它指向指定的服务器和端口。您可以查询 DNS.GetHostEntry 以将计算机名称更改为 IPHostEntry 对象。
  • 使用以下参数创建一个套接字对象:AddressFamily.InterNetwork(IP 版本 4)、SocketType.Stream(依赖于 InterNetwork 和 Tcp 参数)、ProtocolType.Tcp(可靠的双向连接)
  • 像这样打开套接字:socket.Connect(endpoint); //是的,就是这么简单 使用 socket.Send(... 等等,我忘记了一些事情。你必须先对数据进行编码,这样它才能飞过它们的电线。
  • 使用 Encoding.ASCII.GetBytes 将您对服务器的好消息转换为字节。然后使用 socket.Send 在途中发送这些字节。
  • 使用 socket.Receive 监听响应(一次一个字节,或进入一个字节数组)不要忘记通过调用 socket.Close() 进行清理

您可以 [还] 使用 System.Net.Sockets.TcpClient 对象而不是套接字对象,该对象已经将套接字参数配置为使用 ProtocolType.Tcp。所以让我们来看看这个选项:

  1. 创建一个新的 TcpClient 对象,它带有一个服务器名称和一个端口(不需要 IPEndPoint,很好)。
  2. 通过调用 GetStream() 从 TcpClient 中拉出 NetworkStream
  3. 使用 Encoding.ASCII.GetBytes(string) 将您的消息转换为字节 现在您可以分别使用 stream.Write 和 stream.Read 方法发送和接收数据。顺便说一下,stream.Read 方法返回写入接收数组的字节数。
  4. 使用 Encoding.ASCII.GetString(byte array) 将数据恢复为人类可读的格式。
  5. 通过调用 stream.Close() 和 client.Close() 在网络管理员发疯之前清理你的烂摊子。
于 2009-06-27T19:46:14.277 回答
4

对于简单的任务(例如连接到具有类似 telnet 接口的专用硬件设备),通过套接字连接并发送和接收文本命令可能就足够了。

如果您想连接到真正的 telnet 服务器,您可能需要处理 telnet 转义序列、面对终端仿真、处理交互式命令等。使用一些已经测试过的代码,例如CodeProject 的 Minimalistic Telnet 库(免费)或一些商业 Telnet/终端仿真器库(例如我们的Rebex Telnet)可能会为您节省一些时间。

以下代码(取自此 url)显示了如何使用它:

// create the client 
Telnet client = new Telnet("servername");

// start the Shell to send commands and read responses 
Shell shell = client.StartShell();

// set the prompt of the remote server's shell first 
shell.Prompt = "servername# ";

// read a welcome message 
string welcome = shell.ReadAll();

// display welcome message 
Console.WriteLine(welcome);

// send the 'df' command 
shell.SendCommand("df");

// read all response, effectively waiting for the command to end 
string response = shell.ReadAll();

// display the output 
Console.WriteLine("Disk usage info:");
Console.WriteLine(response);

// close the shell 
shell.Close();
于 2010-09-02T12:09:14.463 回答