使用.net进行Telnet连接

时间:2010-05-25 16:23:43

标签: c# sockets telnet

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

  1. 连接 - telnet opent 128 ........ 25000
  2. 查询 - 我们粘贴查询,然后点击alt + 019
  3. 响应 - 我们在telnet窗口中以文本形式收到响应
  4. 所以我正在尝试使用c#app自动进行此查询。我的代码如下

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

        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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

一般来说,使用Wireshark等网络分析工具(嗅探器)可以轻松解决此类问题。

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

答案 2 :(得分:1)

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

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