Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

POP3: завершение приёма письма.

38K
21 августа 2008 года
bdv1983
12 / / 27.07.2008
Здравствуйте!

Мне нужно получить письмо. Делаю так:
Код:
char text[1024];
// Создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
    MessageBox(NULL, "Error in socket(...)", "SMTPOP", MB_OK);
    return false;
};
...
// Заполняем параметры адреса.
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *)d_addr->h_addr);
addr.sin_port = htons(110); // POP3
// УСТАНАВЛИВАЕМ соединение.
if (SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr)))){
    MessageBox(NULL, "Error in connect(...)", "SMTPOP", MB_OK);
    return false;
};
...
send(s, text, "RETR 1", 0);
int FDest;
FDest = _open(fName, _O_BINARY|_O_TRUNC|_O_WRONLY|_O_CREAT,
    _S_IREAD|_S_IWRITE );
result = recv(s, text, sizeof(text), 0);
while(strncmp(text, "\r\n.\r\n", 5) != 0)
{
    _write(FDest, text, result);
    result = recv(s, text, sizeof(text), 0);
}

Так вот у меня на компьютере письмо получается нормально. Нормально получается и на другом компьютере где стоит Visual Studio. Но не работает на компьютерах где нет студии - зависает в цикле на команде recv. При этом всё письмо записывается в файл, а вот ответ от сервера "\r\n.\r\n" почему-то не приходит. В чём дело, какое правильное условие для завершения приёма письма?
15K
24 августа 2008 года
like-nix
46 / / 27.06.2007
имхо лучше так

Код:
char text[1024] = {0};
// Создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
    MessageBox(NULL, "Error in socket(...)", "SMTPOP", MB_OK);
    return false;
};
...
// Заполняем параметры адреса.
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *)d_addr->h_addr);
addr.sin_port = htons(110); // POP3
// УСТАНАВЛИВАЕМ соединение.
if (SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr)))){
    MessageBox(NULL, "Error in connect(...)", "SMTPOP", MB_OK);
    return false;
};
...
send(s, text, "RETR 1", 0);
int FDest;
FDest = _open(fName, _O_BINARY|_O_TRUNC|_O_WRONLY|_O_CREAT,
    _S_IREAD|_S_IWRITE );

while((result = recv(s, text, sizeof(text), 0)) > 0)
{
     int rn = strstr(text+strlen(text)-5, "\r\n.\r\n") != NULL ? strstr(text+strlen(text)-5, "\r\n.\r\n") - text : -1;
     if(rn != -1){
     text[rn+1] = '\0';
     _write(FDest, text, rn+1);
     break;
     }
_write(FDest, text, result);
}
38K
27 августа 2008 года
bdv1983
12 / / 27.07.2008
Пока сделал так:
 
Код:
while(strncmp(text, "\r\n.\r\n", 5) != 0 &&
        strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
    {
        _write(FDest, text, result);
        result = recv(s, text, 1024, 0);
    }
15K
30 августа 2008 года
like-nix
46 / / 27.06.2007
Цитата: bdv1983
Пока сделал так:
 
Код:
while(strncmp(text, "\r\n.\r\n", 5) != 0 &&
        strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
    {
        _write(FDest, text, result);
        result = recv(s, text, 1024, 0);
    }



В таком варианте последняя строка в письме не записывается в файл

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог