2010-05-25 100 views
4

我们的办公室当前使用telnet来查询外部服务器。程序是这样的。使用.net的Telnet连接

  1. 连接 - 远程登录opent 128 ........ 25000
  2. 查询 - 我们粘贴查询,然后按下Alt + 019
  3. 响应 - 我们收到响应如telnet窗口文本

所以我试图使这个查询自动使用ac#应用程序。我的代码如下

首先连接。 (没有例外)

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并发送相同的查询,“获得远程主机强制关闭的连接”我马上得到响应

任何想法或建议?

+2

你发送ALT + 019在自动查询?与你的问题没有关系,但你应该使用'throw'而不是'throw ex'重新抛出异常。 'throw'会使堆栈跟踪保持不变,这并不是你的问题,只是一些有用的信息。 – 2010-05-25 16:38:46

+0

我不知道如何发送Alt + 019,如果你在记事本中打它它不打印任何东西,它只是在telnet工作,我一直试图找到一些谷歌ALT + 019的参考,但没有运气。 – alejandrobog 2010-05-25 16:43:38

+2

@alejandrobog,将字节19添加为缓冲区中的最后一个字节。 Ascii 19是一个控制字符,因此它可能对端点服务器有意义。 – 2010-05-25 16:47:24

回答

5

根据你和我之间的评论交换,看起来你需要在你的查询结尾添加Ascii代码19(0x13)。

2

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

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