【问题标题】:Telnet connection using .net使用 .net 的 Telnet 连接
【发布时间】:2011-02-23 18:57:10
【问题描述】:

我们的办公室目前使用 telnet 来查询外部服务器。过程是这样的。

  1. 连接 - telnet opent 128........ 25000
  2. 查询 - 我们粘贴查询,然后按 alt + 019
  3. 响应 - 我们在 telnet 窗口中以文本形式接收响应

所以我尝试使用 C# 应用程序自动执行此查询。我的代码如下

首先是连接。 (没有例外)

    SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    String szIPSelected = txtIPAddress.Text;
    String szPort = txtPort.Text;
    int alPort = System.Convert.ToInt16(szPort, 10);

    System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected);
    System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);
    SocketClient.Connect(remoteEndPoint);

然后我发送查询(无例外)

    string data ="some query";
    byte[] byData = System.Text.Encoding.ASCII.GetBytes(data);
    SocketClient.Send(byData);

然后我尝试接收响应

    byte[] buffer = new byte[10];
    Receive(SocketClient, buffer, 0, buffer.Length, 10000);
    string str = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
    txtDataRx.Text = str;

public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
  int startTickCount = Environment.TickCount;
  int received = 0;  // how many bytes is already received
  do
  {
    if (Environment.TickCount > startTickCount + timeout)
      throw new Exception("Timeout.");
    try
    {
      received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
    }
    catch (SocketException ex)
    {
      if (ex.SocketErrorCode == SocketError.WouldBlock ||
          ex.SocketErrorCode == SocketError.IOPending ||
          ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
      {
        // socket buffer is probably empty, wait and try again
        Thread.Sleep(30);
      }
      else
        throw ex;  // any serious error occurr
    }
  } while (received < size);
}

每次我尝试接收响应时,如果打开 telnet 并发送相同的查询,我都会收到“现有连接已被远程主机强制关闭”,我会立即收到响应

有什么想法或建议吗?

【问题讨论】:

  • 您是否在自动查询中发送 Alt+019?与您的问题无关,但您应该只使用“throw”而不是“throw ex”来重新抛出异常。 'throw' 将保持堆栈跟踪完好无损,这不是你的问题,只是一些有用的信息。
  • 我不知道如何发送 Alt + 019,如果你在记事本中点击它,它不会打印任何东西,它只能在 telnet 中使用,我一直在尝试在谷歌中找到一些关于 Alt + 019 的参考但没有运气。
  • @alejandrobog,将字节 19 添加为缓冲区中的最后一个字节。 Ascii 19 是一个控制字符,因此它可能对端点服务器具有重要意义。
  • 谢谢,听起来不错,我会在几分钟内尝试。感谢您的帮助。
  • @Chris Taylor,我添加了字节 19,它成功了!请将其发布为答案,以便我给你信用。谢谢

标签: c# sockets telnet


【解决方案1】:

这是一个 telnet 库的示例,以及一个使用它登录到 Cisco 路由器并下载 IOS 配置的程序。

http://www.xpresslearn.com/networking/code/csharp-telnet-client

【讨论】:

    【解决方案2】:

    根据您和我之间的评论交流,您似乎需要在查询末尾附加 Ascii 代码 19 (0x13)。

    【讨论】:

      【解决方案3】:

      一般来说,这类问题很容易通过使用网络分析工具(嗅探器)来解决,例如Wireshark

      更具体地说,telnet 协议在会话开始时包括一个协商步骤。我猜如果你忽略这一点,主人会不高兴。在成功的 telnet 连接上使用 Wireshark 将显示您缺少的内容。

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 2021-02-18
        • 1970-01-01
        • 2011-12-07
        • 2018-03-26
        • 2011-05-30
        • 2014-01-08
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多