代码之家  ›  专栏  ›  技术社区  ›  alejandrobog

使用.NET的telnet连接

  •  4
  • alejandrobog  · 技术社区  · 15 年前

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

    1. 连接-telnet opent 128……..二万五千
    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并发送相同的查询,我会立即得到响应。

    有什么想法或建议吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Chris Taylor    15 年前

    基于您和我之间的注释交换,您似乎需要在查询的末尾附加ASCII代码19(0x13)。

        2
  •  2
  •   jdigital    15 年前

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

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

        3
  •  1
  •   Scott    15 年前

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

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