【问题标题】:linux c/c++ programming telnet connection io redirectionlinux c/c++编程telnet连接io重定向
【发布时间】:2010-10-01 05:01:40
【问题描述】:

我有一台计算机(比如计算机 A),只要计算机 A 通过特定的 telnet 端口建立连接,它就会启动一个程序。

计算机 A 上的这个程序处理登录、身份验证等。它可以做的工作之一是接收文件。它通过启动 gKermit 来处理这个问题。

<pre>/usr/local/bin/gkermit -e 8000 -w -a /location/x/ -ir</pre>

我在计算机 B 上有第二个程序。第二个程序将连接到计算机 A

mPid = forkpty(&mPort, buffer, &mCurrTermattr, NULL);
...
if child
{
    execl("/usr/bin/telnet", "telnet", mComPort.name.c_str(), NULL);
}

现在程序的父进程可以使用文件描述符mPort来发送接收数据了。 (即像登录计算机 A,并告诉它接收文件)

问题是当计算机 B 启动 gKermit 发送文件时,它无法与计算机 A gKermit 通信。 <pre>system(gkermit -d gkermit.txt -X -e 8000 -i -s testfile.txt)</pre>

有人会认为,如果我们正在使用 mPort 进行通信,我们可以通过以下方式重定向计算机 B 系统调用 stdio 以使用该 mPort:

<pre>dup2(mPort, STDIN_FILENO)</pre>

然而这并不能解决问题。任何帮助将不胜感激。

【问题讨论】:

  • 我不确定我是否理解问题所在。如果不是使用 system(...) 调用,而是尝试从计算机 B 上的 shell 远程登录到计算机 A,会发生什么?

标签: linux redirect io telnet


【解决方案1】:

我可能错了,但您需要重定向标准输出(如果 kermit 通信是双向的,可能还需要重定向标准输入)。另外,我有点好奇什么是 mPort,一个管道?你读和写它吗?通常,您有两个文件描述符,一个用于读取,一个用于写入。

【讨论】:

  • mPort 是从 forkpty() 返回的文件描述符 [link text][1] 数据通过 telnet 连接从计算机 B 发送/接收到计算机 A,使用 mPort 作为 read()/ 中的文件描述符写()[1]:linux.die.net/man/3/forkpty
  • 在不分配终端的情况下您的程序是否可以工作(例如,使用普通管道?)我会尝试一下,因为传递给终端的数据之间的对应关系不等于在子节点中读取的数据。当然,重定向两个 fd。
【解决方案2】:

感谢 jpalecek 的回复,

好像加了:

dup2(mPort, STDOUT_FILENO)

现在允许 gKermint 双向通信。这当然是有道理的。呃

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多