C++使用socket实现telnet下发指令

时间:2022-06-08 15:16:15
最近一个项目需要用到telnet协议连接到远程机下发指令。
现方案如下:
1、使用socket连接到远程主机
2、下发提供的指令
3、接收返回信息
4、判断返回信息是否成功
5、继续下发下一条指令


问题:
1、因为telnet协议本身对平台差异进行了封装,自动选择\r\n或\n换行符,那么我通过socket连接,如何知道远程主机使用哪种换行符。
2、我怎么确定返回消息接收完毕,对于TCP协议,如果数据量较大,会分多个数据包返回,我怎么确保接收的数据是完整的。

5 个解决方案

#1


TCP 是基于流的, 又不是数据包的, 你处理的并不是一个一个的数据包.
telnet 本身是一个字符一个字符发的, 也不是基于指令的.

#2


引用 1 楼 adlay 的回复:
TCP 是基于流的, 又不是数据包的, 你处理的并不是一个一个的数据包.
telnet 本身是一个字符一个字符发的, 也不是基于指令的.


可能是我表达的不够清楚,比如你用telnet直接登录到服务器,然后输入ls, 那么你就会看到返回信息, 那么现在我是用socket连接到服务器,我发送ls,一样会收到返回信息,就如你说的,tcp是基于流的,所以我没法知道数据是否接受完毕。

#3


引用 楼主 fengqiao1999 的回复:
最近一个项目需要用到telnet协议连接到远程机下发指令。
现方案如下:
1、使用socket连接到远程主机
2、下发提供的指令
3、接收返回信息
4、判断返回信息是否成功
5、继续下发下一条指令


问题:
1、因为telnet协议本身对平台差异进行了封装,自动选择\r\n或\n换行符,那么我通过socket连接,如何知道远程主机使用哪种换行符。
2、我怎么确定返回消息接收完毕,对于TCP协议,如果数据量较大,会分多个数据包返回,我怎么确保接收的数据是完整的。

遇到\r\n 或者 \n都换行,这个不难实现吧

#4


telnet 的客户端是不知道 ls 命令的,它所做的就是把键盘输入发送出去,把服务器返回显示出来,你输入 ls 的回显都是服务器返回的,网络慢的时侯你按下键盘半天才显示出来就是这个道理,显示都是服务器返回的。
如果你的服务器是标准的 telnet 服务,那就简单了,在收到的数据里面查找命令提示符来分割不同的命令的结果吧

#5


那要是命令执行结果中如果含有提示符,那岂不是制造“接收完毕”的假象?

#1


TCP 是基于流的, 又不是数据包的, 你处理的并不是一个一个的数据包.
telnet 本身是一个字符一个字符发的, 也不是基于指令的.

#2


引用 1 楼 adlay 的回复:
TCP 是基于流的, 又不是数据包的, 你处理的并不是一个一个的数据包.
telnet 本身是一个字符一个字符发的, 也不是基于指令的.


可能是我表达的不够清楚,比如你用telnet直接登录到服务器,然后输入ls, 那么你就会看到返回信息, 那么现在我是用socket连接到服务器,我发送ls,一样会收到返回信息,就如你说的,tcp是基于流的,所以我没法知道数据是否接受完毕。

#3


引用 楼主 fengqiao1999 的回复:
最近一个项目需要用到telnet协议连接到远程机下发指令。
现方案如下:
1、使用socket连接到远程主机
2、下发提供的指令
3、接收返回信息
4、判断返回信息是否成功
5、继续下发下一条指令


问题:
1、因为telnet协议本身对平台差异进行了封装,自动选择\r\n或\n换行符,那么我通过socket连接,如何知道远程主机使用哪种换行符。
2、我怎么确定返回消息接收完毕,对于TCP协议,如果数据量较大,会分多个数据包返回,我怎么确保接收的数据是完整的。

遇到\r\n 或者 \n都换行,这个不难实现吧

#4


telnet 的客户端是不知道 ls 命令的,它所做的就是把键盘输入发送出去,把服务器返回显示出来,你输入 ls 的回显都是服务器返回的,网络慢的时侯你按下键盘半天才显示出来就是这个道理,显示都是服务器返回的。
如果你的服务器是标准的 telnet 服务,那就简单了,在收到的数据里面查找命令提示符来分割不同的命令的结果吧

#5


那要是命令执行结果中如果含有提示符,那岂不是制造“接收完毕”的假象?