• 11678阅读
  • 14回复

在windows下 QProcess 调用Telnet 启动失败? [复制链接]

上一主题 下一主题
离线wayne
 

只看楼主 倒序阅读 楼主  发表于: 2013-11-26
— 本帖被 XChinux 设置为精华(2013-11-27) —
我的程序 是用 QProcess启动一个telnet, ,比如 telnet某一个服务器地址,
    proc->start(QString("telnet %1").arg(list[0]));
然后向该process 写入一个telnet 下的命令,
proc->write(qPrintable(QString("ping %1\n").arg(list[i])))
如果将代码编译Linux应用程序,一切如期运行.

但同样的代码,不作任何改动,在windows下 编译出来的程序,运行 老是 "程序异常终止"
我debug了一下,发现 telnet进程压根就没有成功start起来, 状态总是 QProcess::FailedToStart

另外,我的windows机器的telnet是开启的,即我单独在cmd下面 能跑telnet.

有谁知道 这是什么回事吗





离线toby520

只看该作者 1楼 发表于: 2013-11-27
建议楼主使用pro->start(QString cmd,QStringList lst); 不过QProcess确实问题比较多,特别是在windows上面
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线wayne

只看该作者 2楼 发表于: 2013-11-27
回 1楼(toby520) 的帖子
谢谢,这个我也试过,问题仍然存在
离线dbzhang800

只看该作者 3楼 发表于: 2013-11-27
QProcess 是有些问题,但是像 QProcess::FailedToStart 以及 "程序异常终止" 等问题,应该还是出在楼主自身的代码上。

题外:或许可以考虑 QtTelnet 一类的东西 http://docs.huihoo.com/qt/solutions/4/qttelnet/qttelnet.html
离线wayne

只看该作者 4楼 发表于: 2013-11-27
回 3楼(dbzhang800) 的帖子
代码能有什么问题?
我在Linux下编译和运行都很正常。
在widnows下运行才有问题。
我的程序加了
connect(proc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));

我可以不加这个的,不过,程序处于 不工作的状态。


离线dbzhang800

只看该作者 5楼 发表于: 2013-11-27
你可以贴出你测试用的 可编译运行的最小的例子。

题外:Linux 编译运行正常并不能说明代码没问题
离线wayne

只看该作者 6楼 发表于: 2013-11-27
多谢版主关注。
我现在手头没有widnows,午饭后找一个同事的电脑 测试一下minimal的例子,呈现出来。
离线wayne

只看该作者 7楼 发表于: 2013-11-27
回 5楼(dbzhang800) 的帖子
Linux 下运行正常,图片如下:


windows下,提示“启动失败”

  1. #include "dialog.h"
  2. #include <QFile>
  3. #include <QTextStream>
  4. #include <QPalette>
  5. Dialog::Dialog(QWidget *parent): QWidget(parent)
  6. {
  7.     layout = new QGridLayout(this);
  8.     notice = new QLabel("",this);
  9.     edit = new QTextEdit(msg,this);
  10.     //edit->setEnabled(false);
  11.     //edit->setStyleSheet("font:20px;");
  12.     layout->addWidget(notice,0,0,1,1);
  13.     layout->addWidget(edit,1,0,1,1);
  14.     setLayout(layout);
  15.     setMinimumWidth(700);
  16.     proc= new QProcess(this);
  17.     connect(proc, SIGNAL(readyReadStandardOutput()), this,SLOT(readFromStdOut()));
  18.     connect(proc, SIGNAL(readyReadStandardError()), this, SLOT(readFromStdErr()));
  19.     //connect(proc, SIGNAL(started()), this, SLOT(proceed()));
  20.     connect(proc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
  21.     connect(proc, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processFinished(int,QProcess::ExitStatus)));
  22.     notice->setText(QString("正在登陆..."));
  23.     proc->start(QString("telnet bbs.ustc.edu.cn"));
  24.     timer = new QTimer(this);
  25.     timer->setSingleShot(true);
  26.     connect(timer,SIGNAL(timeout()),this,SLOT(timerOut()));
  27.     gbk=QTextCodec::codecForName("GBK");
  28. }
  29. void Dialog::paintEvent(QPaintEvent *event)
  30. {
  31.     Q_UNUSED(event);
  32. }
  33. Dialog::~Dialog()
  34. {
  35.     
  36. }
  37. //void Dialog::proceed()
  38. //{
  39. //    proc->write(qPrintable(list[1]+'\n'));
  40. //}
  41. void Dialog::readFromStdOut()
  42. {
  43.     msg.append(gbk->toUnicode(proc->readAllStandardOutput()));
  44.     QString tmp=msg.split('\n', QString::SkipEmptyParts).last();
  45.     if(tmp.contains("suffix"))
  46.     {
  47.         proc->write("guest\n");
  48.     }
  49.     edit->setText(msg);
  50. }
  51. void Dialog::readFromStdErr()
  52. {
  53.     msg.append(proc->readAllStandardError());
  54.     edit->setText(msg);
  55.     qDebug()<<"!!!!!!!!"<<msg;
  56. }
  57. void Dialog::processError(QProcess::ProcessError error)
  58. {
  59.     if(error==QProcess::FailedToStart)
  60.     {
  61.         msg.append("程序启动失败.");
  62.     }
  63.     edit->setText(msg);
  64. }
  65. void Dialog::processFinished(int ,QProcess::ExitStatus exitStatus)
  66. {
  67.     if(exitStatus == QProcess::CrashExit)
  68.     {
  69.         msg.append("程序异常终止.");
  70.         edit->setText(msg);
  71.     }
  72.     else
  73.     {
  74.         //
  75.     }
  76.     edit->setText(msg);
  77.     qDebug()<<msg;
  78.     timer->start(3000);
  79.     notice->setText("quitting in 3 seconds.");
  80. }
  81. void Dialog::timerOut()
  82. {
  83.     emit closing();
  84. }



离线wayne

只看该作者 8楼 发表于: 2013-11-27
代码 打包如下:

minimal.tar.gz (2 K) 下载次数:16
离线dbzhang800

只看该作者 9楼 发表于: 2013-11-27
估计是Windows下的telnet自身的问题吧,你在cmd下试试它的重定向是否工作正常

telnet bbs.ustc.edu.cn > output.txt
离线wayne

只看该作者 10楼 发表于: 2013-11-27
回 9楼(dbzhang800) 的帖子
great!
windows下的telnet 不支持重定向, 看来这就是问题所在了
离线XChinux

只看该作者 11楼 发表于: 2013-11-27
加精
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线wayne

只看该作者 12楼 发表于: 2013-11-27
额, 这就精华了?



离线XChinux

只看该作者 13楼 发表于: 2013-11-27
探讨清楚一个问题,别人就少走弯路。楼主在主帖中补完整研究内容吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线wayne

只看该作者 14楼 发表于: 2013-11-28
既然windows自带 的telnet 不中用.
我换了plink,发现 效果很好


plink -telnet bbs.ustc.edu.cn




快速回复
限100 字节
 
上一个 下一个