我们的办公室目前使用telnet查询外部服务器。程序是这样的。
所以我正在尝试使用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并发送相同的查询,我立即收到回复
任何想法或建议?
答案 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