Чтобы помочь себе освоить программирование сокетов, я создал очень простой SMTP-клиент (см. Код ниже), используя некоторый код из библиотеки Wt SMTP
В качестве упражнения я подумал, что мне нужно сделать попытку внедрения клиента POP3. Используя Википедию в качестве ссылки, выглядело так, как будто вы должны просто подключиться к серверу через порт 110 и отправить команды (так же, как SMTP подключается к порту 25 и отправляет команды).
Тем не менее, я до сих пор не мог даже подключиться, и в основном просто время ожидания в get_response()
каждый раз. Я попытался подключиться к pop.gmail.com
, но безуспешно.
Я не верю, что вам нужно отправлять какую-либо информацию о пользователе / пароле / другой информации при первом установлении соединения? Я ожидал, что получу что-то вроде +OK POP3 Server Ready
после подключения, и тогда я смогу отправить команды USER
и PASS
.
Мой вопрос: я что-то упускаю во время фазы соединения? Я пытаюсь подключиться к плохому хосту (gmail)? Если да, то есть ли лучший хост, чем pop.gmail.com
, с которым я могу проверить? Или я совершенно не прав?
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main()
{
boost::asio::io_service io_service;
tcp::socket socket(io_service);
tcp::resolver resolver(io_service);
tcp::resolver::query query("localhost", "25"); // Change this for POP3
tcp::resolver::iterator endpt_iter = resolver.resolve(query);
boost::system::error_code erc = boost::asio::error::host_not_found;
while(erc && endpt_iter != end)
{
socket.close();
socket.connect(*endpt_iter++, erc);
}
if(erc) { socket.close(); return }
std::cout << get_response(socket) << std::endl; // 220 <my-host-name> ESMTP Postfix
send(socket, "EHLO localhost\r\n");
std::cout << get_response(socket) << std::endl; // 250-<my-host-name>
return 0;
}
std::string get_response(tcp::socket& socket)
{
boost::asio::streambuf response;
for(;;)
{
std::string msg;
boost::asio::read_until(socket, response, "\r\n");
std::istream in(&response);
std::getline(in, msg);
return msg;
}
}
void send(tcp::socket& socket, std::string msg)
{
boost::asio::write(socket, boost::asio::buffer(msg));
}