LINUX.ORG.RU

[C] Почему на запрос (по протоколу POP3) PASS не приходит ответ от сервера?


0

1

Почти закончил писать учебный pop3 клиент,вроде работает (осталось только доделать порядок байтов,верхний уровень и интерфейс доделать),но вот странное дело - после успешной отправки серверу имени ящика и получения положительного ответа, отправляю запрос PASS «тут пароль от ящика» и в ответ ничего не приходит, и функция wait_for_packets,вызываемая функцией receive_srv_answer в netlib.c возвращает код ошибки CLIENT_TIMEOUT (потому что select возвращает 0).

Почему такое может быть? Ведь на первый запрос сервер отвечает нормально. Надеюсь,кто нибудь глянет на код,я для этого специально закачал его на sf.net - http://sourceforge.net/projects/simplemailclien/

Интерфейс пока не доработан,поэтому слегка не понятен на первый взгляд - сначала печатается меню,потом пользователь вводит номер опции + Enter,затем саму опцию + Enter. Немного запутывает,если приходит положительный ответ от сервера «+OK password required for user pupkin» и тут же норовишь послать пароль,но сначала номер опции,а потом пароль :) Это так,небольшое пояснение. Помогите,пожалуйста!

Ответ на: комментарий от mv

grep в сорцах \r не обнаружил. На фронтэнде стоит какой-нибудь nginx, решающий, что с коннектом делать, и спокойно обрабатывающий один \n. А бэкенд хотчет нормальный crlf, поэтому конца строчки от твоей поделки не видит.

mv ★★★★★ ()

всё очень просто. снифаешь нормальную сессию, снифаешь свою и сравниваешь.

true_admin ★★★★★ ()

Ужос какой то, а не исходник. Вот, допустим

   user_choice = memalloc (sizeof(char_t) * MENU_MAX_CHOICES_NUM_WIDTH          
                                                            + 1 /* for '/n' */  
                                                            + 1 /* for '/0' */);
Ну ладно, заменили malloc на свою memalloc, проверяете размер на ноль, суммируете объем выделенной памяти, хотя для учебной задачи это, ИМХО, лишнее. Но зачем слеш в другую сторону ставить? От '/0' ломается парсер и зачем выпендриваться с sizeof(char_t), если на перевод строки и ноль отдаёте по 1 байту?

Вобще со строками работаете очень странно, там у вас char, а там uint8_t, про требуемый в стандарте '\r\n' вам написали, добавлю, что некоторые pop3 сервера не любят, когда после '\r\n' им приходит мусор (нули), а у вас они приходят, так как у вас отправляется запрос фиксированной длины «sizeof(req_packet.text)».

И команда завершения сессии это «QUIT\r\n», пробела там нет.

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо за поучения,это мне полезно! Слеш в другую сторону-это я просто перепутал. Я на Си никогда не писал,да и вообще я начинающий,многого не знаю,со строками тоже никогда толком не работал, до этого моя учебная программа была на C++,а там string. А uint8 делал из соображений содержания в сообщении нуль-символа более одного раза (я просто так понял смысл multiline-сообщения),ну и просто для себя,экспериментировал. Там ещё надо будет порядок байт делать,для наглядности сделал int8.

pragmadevel ()
Ответ на: комментарий от pragmadevel

Спасибо.интересно,а как же тогда проходит команда USER?

Я уже писал про фронтенд и бэкенд. У, например, gmail.com по imap до login канает просто cr, а после успешного login - только crlf.

mv ★★★★★ ()
Ответ на: комментарий от mky

ООО! Спасибо Вам огромное! Наконец-то я получил положительный ответ от сервера «+OK Maildrop ready»! Дело было,оказывается,как раз в дополнительных нулях,и вместо sizeof( req_packet.text) я пока написал strlen( (char_t *)req_packet.text ). Радости полные штаны :D Теперь постараюсь привести всё это в более-менее божеский вид.

pragmadevel ()
Ответ на: комментарий от mv

Может, конечно, фронтенд/бэкенд. А может и pop3 сервер такой.

У меня есть древний дистр, там древний pop3 (от imap2001). Он нормально принимал «USER ...» не смотря на отсутствие '\r' и мусор из нулей. А вот на «PASS ...\n\0\0\0\0» ругался "-ERR Command line too long".

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.