目前我正在开发一个网络项目,其中包括连接到tcp服务器和一些设备。很长一段时间我成功使用下面的代码发送tcp命令并接收某些设备型号的响应,但是当我尝试用于Windows Telnet Server 2003和Fortigate设备时,即使我可以成功构建tcp连接,我只能得到响应是一些字符集,如??%??????'????。
我接收回复的功能是:
private string receive()
{
StringBuilder sbReadBuffer = new StringBuilder();
bool isFinished = false;
NetworkStream ns = tcpClient.GetStream();
DateTime lastConTime = DateTime.Now;
while (!isFinished)
{
if (!ns.DataAvailable)
{
Thread.Sleep(200);
if ((DateTime.Now - lastConTime).TotalSeconds > Prms.tcpSendReceiveTimeoutInSeconds)
break;
else
continue;
}
Int32 receiveCount = ns.Read(receiveBuffer, 0, receiveBuffer.Length);
String received = new ASCIIEncoding().GetString(receiveBuffer, 0, receiveCount);
sbReadBuffer.Append(received);
foreach (String terminaterToken in terminaterTokens)
if (sbReadBuffer.ToString().EndsWith(terminaterToken))
isFinished = true;
lastConTime = DateTime.Now;
}
return sbReadBuffer.ToString();
}
}
用于构建tcp连接和调用receive函数:
TcpClient tcpClient = new TcpClient()
{
SendTimeout = 10000,
ReceiveTimeout = 10000
};
tcpClient.Connect(wanIp, 23);
String initialMessage = receive();
我为上面代码的设备测试收到的消息没有问题,我意识到每个不同的设备模型初始响应总是像“??%??????? ????”但它之后是逻辑响应,如“welcome”vs。
在我的测试中,我发现程序成功连接到服务器/设备但无法接收有效的响应,我不知道为什么。有什么想法吗?
答案 0 :(得分:1)
导致“??%??”的问题符号是因为telnet选项IAC。返回响应值,因为IAC的十进制代码大于255.可以从地址
获得有关IAC的更多信息support.microsoft.com/kb/231866
IAC值的问题是,当您尝试使用标准代码使用C#tcpClient解析响应时
byte[] sendBuffer = new ASCIIEncoding().GetBytes(str + strNewLine);
tcpClient.GetStream().Write(sendBuffer, 0, sendBuffer.Length);
当收到IAC值时,代码会产生上述“??%”值。
为了防止这种情况并处理IAC值,我做了一些研究,并在地址http://www.codeproject.com/KB/IP/TelnetSocket.aspx上找到了一个出色的telnet项目,它完美地处理了IAC值。
为了更好地理解处理IAC值,同时检查 MinimalisticTelnet 库的源代码将非常有用。我能够在没有问题的情况下使用MinimalisticTelnet获得响应但是它在为我工作的设备发送消息时失败了所以我更喜欢telnet套接字项目。但我强烈建议学习MinimalisticTelnet源代码以便更好地理解。