Как я могу получить результат telnet, используя C / Objective C? - PullRequest
2 голосов
/ 26 мая 2010

Вот сайт телнета:

телнет: //202.85.101.136: 8604 /

Это из публичной библиотеки Гонконга, могу ли я написать какую-нибудь программу для получения строки / результата из службы telnet и отправить запрос из C / Objective C? тыс.

Ответы [ 2 ]

7 голосов
/ 26 мая 2010

Конечно, это возможно. Telnet - это довольно простой протокол, вам просто нужно открыть сокет TCP и подключить его к этому IP и порту. При первом подключении сервер telnet отправит несколько запросов на согласование, используя двоичный протокол, определенный в RFC854, на который должен отвечать ваш клиент. Когда согласование завершено, вы общаетесь, просто отправляя и получая данные ASCII, обычно по одной строке за раз.

Для простого сеанса telnet "получить некоторые данные из хоста", когда вы не пытаетесь провести настоящий интерактивный сеанс, иногда достаточно просто принять все параметры согласования серверов, чтобы избежать реализации всего протокола согласования. Чтобы сделать это, просто найдите сервер, который отправит вам несколько 3-байтовых команд в формате: 0xFF 0xFD xx, который в основном является сервером, говорящим вам «Я хочу, чтобы вы использовали опцию X», просто ответьте на это 0xFF 0xFB хх, что в основном означает, что вы просто соглашаетесь с тем, о чем просит сервер. Затем, когда вы получаете пройденные переговоры, вам просто нужно получить строки с чтением через сокет и отправить команды с записью в сокет.

3 голосов
/ 26 мая 2010

Если в вашей системе уже есть программа telnet, вы можете использовать ее, чтобы выполнить всю работу по подключению за вас. Вот программа для GNU / Linux, которую вы можете использовать в качестве отправной точки.

Используется popen для выполнения системной команды telnet. Затем он просто читает все данные из канала (стандартный вывод, если вы только что самостоятельно выполнили команду 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, эта ссылка объясняет альтернативу popen.

Есть также программа под названием Expect , которая может помочь вам автоматизировать такие вещи.

...