Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > winsockets


Автор: CWD 26.1.2013, 16:34
Добрый день, возникло желание написать программу на с++ которая сможет заходить на свой почтовый ящик. Вот попробовал реализовать вообще так сказать "переговоры" с сервером. Ничего не получилось, как только пытаюсь получить ответ(стереть комментарий) программа зависает.

Код

#include <winsock.h>
#include <iostream>
SOCKET s; 


bool ConnectToHost(int PortNo, char* IPAddress)
{

    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    if (error)
        return false;
    if (wsadata.wVersion != 0x0202)
    {
        WSACleanup();
        std::cout << ("Error");
        return false;
    }
    SOCKADDR_IN target; 
    target.sin_family = AF_INET; 
    target.sin_port = htons (PortNo); 
    target.sin_addr.s_addr = inet_addr (IPAddress); 

    s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        std::cout << ("Couldn't create the socket");
        return false;
    }  

    if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR)
    {
        std::cout << ("Could not connect");
        return false; 
    }
    else
    {
        std::cout << ("Success");
        return true; 
    }
}


void CloseConnection ()
{
    if (s)
        closesocket(s);
    
    WSACleanup(); 
    std::cout << ("Closed");
}
int main()
{
    char buffer[80];
    memset(buffer, 0, sizeof(buffer));
    ConnectToHost(12350,"127.0.0.1");
    //recv(s,buffer,sizeof(buffer)-1,0);
    CloseConnection();
    system ("Pause");
    return 0;
}

Автор: Олег2005 26.1.2013, 16:47
А серверу после коннекта - ничего не надо посылать?
Как он узнает - что клиенту надо?
Протокол общения с сервером - какой?

Автор: CWD 26.1.2013, 16:56
Олег2005, Протокол общения SMTP. Ну да, наверное что-то нужно отправлять пароль и логин, но в каком формате?

Автор: feodorv 26.1.2013, 17:18
Цитата(CWD @  26.1.2013,  17:56 Найти цитируемый пост)
Протокол общения SMTP.

Вы уверены? SMTP обычно, всё же, используется для отправки почты. А вот для получения почты применяют pop3, imap etc.


Цитата(CWD @  26.1.2013,  17:34 Найти цитируемый пост)
    ConnectToHost(12350,"127.0.0.1");

Порт правильный? Вы на него telnet'ом заходили?

Автор: CWD 26.1.2013, 17:59
feodorv, Ну я просто тестировал этот код на localhoste своего компа. Вообще в идеале хотелось бы реализовать SMTP клиент, который смог бы логинится на свой почтовый ящик. Найти пример мне что-то не удалось.

Автор: feodorv 27.1.2013, 09:20
Цитата(CWD @  26.1.2013,  18:59 Найти цитируемый пост)
я просто тестировал этот код на localhoste своего компа

А что висит на локальном компьютере на 12350 порту?

Автор: CWD 27.1.2013, 15:25
Зарегистрировал почтовый ящик на mail.ru. Зашел телнетом, вроде работает.
220 smtp52.i.mail.ru ESMTP ready
EHLO mail
250-smtp52.i.mail.ru
250-SIZE 73400320
250-8BITMIME
250-AUTH PLAIN LOGIN
250 STARTTLS
AUTH LOGIN
334 VXNlcm5hbWU6

Попробовал реализовать подобное программой 
Код

int main()
{
    char buffer[256];
    char buffer1[256];

    memset(buffer, 0, sizeof(buffer));
    memset(buffer1,0,sizeof(buffer));
    ConnectToHost(25,"94.100.177.1");
    
    send(s,"EHLO mail",sizeof("EHLO mail")-1,0);
    recv(s,buffer,sizeof(buffer)-1,0);
    printf(buffer);

    send(s,"AUTH LOGIN",sizeof("AUTH LOGIN")-1,0);
    recv(s,buffer1,sizeof(buffer1)-1,0);
    printf(buffer1);

    CloseConnection();
    system ("Pause");
    return 0;
}


Выдает 220 smtp52.i.mail.ru ESMTP ready и зависает.

Автор: feodorv 27.1.2013, 15:48
Цитата(CWD @  27.1.2013,  16:25 Найти цитируемый пост)
    send(s,"EHLO mail",sizeof("EHLO mail")-1,0);

Нужен символ перевода строки '\n' в самом конце передаваемой строки, иначе сервер считает, что команда не введена до конца, и ждёт её окончания...

Автор: Zmaster555 27.1.2013, 17:01
Цитата

Каждая командная строка заканчивается символами CRLF.


Т.е. в конце каждой строки нужен "\r\n";

Автор: CWD 27.1.2013, 23:40
Zmaster555, 
feodorv, Спасибо! Работает полноценно! А можете подсказать, каким образом можно модифицировать программу что бы она заходила на почту, только через proxy.

Автор: feodorv 28.1.2013, 07:51
Если имеется в виду socks5 прокси, то нужно изучить http://rfc2.ru/1928.rfc... И поискать в сети примеры программ... http://www.xakep.ru/post/19989/...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)