如何使用C / Objective C获取telnet结果?

时间:2010-05-26 14:12:05

标签: c objective-c telnet

这是一个telnet网站:

  

的telnet://202.85.101.136:8604 /

来自香港公共图书馆,我可以编写一些程序来获取telnet服务的字符串/结果,并从C / Objective C发送请求吗?你好。

2 个答案:

答案 0 :(得分:7)

当然可能。 Telnet是一个非常简单的协议,您只需打开一个TCP套接字并将其连接到该IP和端口即可。首次连接时,telnet服务器将使用RFC854中定义的二进制协议发送一些协商请求,客户端应该响应该协议。协商完成后,您只需发送和接收ASCII数据进行通信,通常一次一行。

对于一个简单的“从主机获取一些数据”telnet会话,您不试图进行真正的交互式会话,它有时可以简单地接受所有服务器协商设置,以避免实现整个协商协议。要做到这一点,只需寻找服务器发送几个3字节命令,格式为:0xFF 0xFD xx,这基本上是服务器告诉你“我希望你使用选项X”,只需用0xFF 0xFB响应这个xx,基本上只是你同意服务器要求的任何东西。然后,当您通过协商时,您只需要接收带有套接字读取的行并使用套接字写入发送命令。

答案 1 :(得分:3)

如果您的系统上已有telnet程序,则可以使用它来为您完成所有连接工作。这是一个gnu / Linux程序,您可以将其作为起点。

它使用popen来执行系统的telnet命令。然后它只读取管道中的所有数据(stdout,如果你刚刚从shell执行telnet命令)并打印它。当没有更多数据需要阅读时,它会退出。

您可以通过以rw模式而不是r打开管道,然后像编写任何其他文件一样编写数据,从而将数据发送到服务器。您可以有条件地执行扫描输入Username:等内容,然后再发送用户名字符串等。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        const char *cmd = "telnet 202.85.101.136 8604";
        char buffer[256];

        FILE *pipe = popen(cmd, "r");
        if( !pipe ) { perror("popen"); exit(-1); }

        while( fgets(buffer, sizeof(buffer), pipe) != NULL &&
               !feof(pipe) )
        {
                if( ferror(pipe) ) { perror("fgets"); break; }

                /* Here you do whatever you want with the data. */
                printf("%s", buffer);
        }

        pclose(pipe);

        return 0;
}

如果你使用的是Windows,this link解释了popen的替代方案。

还有一个名为Expect的程序可以帮助你automate这样的事情。