Gene Thorpe Ответов: 3

telnet в программе C / C++


Мне нужно написать немного кода в программе C/C++ (программа C с компилятором C++), чтобы использовать telnet. Что я хочу сделать, так это использовать telnet, чтобы проверить, существует ли данный адрес электронной почты на самом деле. Я знаю команды telnet, чтобы сделать это, но не могу понять, как это сделать из программы. Основная проблема заключается в том, что я могу установить соединение telnet, но тогда оно находится в окне, внешнем по отношению к самой программе, ожидающей команд. Как заставить программу выдавать команды и получать ответы?

И если есть лучшая альтернатива проверке наличия адреса электронной почты, я не особенно привязан к telnet.

Спасибо

Richard MacCutchan

Мне было бы интересно узнать, как, по вашему мнению, telnet поможет проверить наличие конкретного адреса электронной почты.

Gene Thorpe

Посмотрите на эту ссылку:

http://www.webdigi.co.uk/blog/wp-content/uploads/2009/01/checkemailtelnet.png

Он даст ответ 250 и скажет "получатель в порядке", если он существует.

Richard MacCutchan

Хорошо, предполагая, что вы проверяете только этот почтовый сервер, он должен работать. Я думаю, что некоторые из приведенных ниже ответов дадут вам необходимую информацию.

3 Ответов

Рейтинг:
26

Aescleal

Я ничего не знаю о почтовых протоколах, но предполагаю, что вы знаете, как подключиться к почтовому серверу с помощью Telnet и сказать ему, что вы хотите сделать.

Есть два способа сделать это. Во-первых, запуск Telnet с вашего приложения перенаправления stdin и stdout от клиента telnet до дескрипторов файлов в вашем собственном приложении. Затем вы можете записать команды во входной дескриптор и прочитать их из выходного дескриптора. Это обычно то, что вы делаете в сценарии оболочки, а не в программе на языке Си, и, вероятно, сложнее, чем второй способ: подключение вашей программы непосредственно к почтовому серверу.

Для прямого подключения к почтовому серверу необходимо использовать API сокетов. Для этого вам нужно знать:

- IP-адрес или имя вашего почтового сервера
- Порт, на котором он предоставляет услугу

То, что вы делаете, - это создаете нечто, называемое сокетом. Это немного похоже на дескриптор файла в windows (а в системах UNIXy это дескриптор файла). Когда вы сделаете это, вы сможете отправлять команды на сервер и читать любые ответы обратно.

это может быть просто как:

- создать сокет (используя socket() функция)
- инициализируйте структуру sockadr для сервера/порта, с которым вы хотите поговорить (используя gethostbyname() и немного поиграли)
- подключитесь к компьютеру и Порту, с которым вы хотите поговорить (с помощью функции connect() )
- для каждой команды, которую вы хотите отправить
- запишите команду в сокет (используя send() функция)
- прочитайте все данные, которые вы можете получить для ответа (используя recv() функция)
- когда вы закончите, уберите все (используя close() функция)

Подробные сведения об этих функциях можно найти по всему интернету. Я бы посоветовал вам проверить документы для вашего компилятора и ОС, поскольку Windows имеет некоторые отличия от платформ UNIXy (ей нужно сделать еще пару шагов). Самый скрипучий бит-это пустая болтовня о разрешении имен, но если вы можете преодолеть это, то все остальное довольно просто.

Овации,

Пепел

Edit: есть довольно устрашающий пример здесь. Если вы пройдетесь по нему со ссылкой на API сокетов, все должно встать на свои места. Или нет :-)


Nelek

хороший ответ. +5

Рейтинг:
1

Mayur B. Shingote

См. команды ниже, чтобы запустить функцию и службу Telnet server/client.

dism / online /enable-feature /featurename:TelnetServer
dism / online /enable-feature /featurename:TelnetClient
net start telnet


Richard MacCutchan

Пожалуйста, не открывайте вопросы четырехлетней давности, особенно те, на которые уже были даны ответы.

Рейтинг:
0

CPallini

Вы можете сами реализовать telnet клиент, основанный на RFC 854RFC 1143, видеть "Простой Клиент Telnet"[^]).
Вы также можете взглянуть на некоторые доступные реализации, например, например: телнет.C по Koders.com[^].


Nelek

хорошие ссылки. +5

CPallini

Спасибо.