LINUX.ORG.RU

POP3, sockets, запаздывающий ответ


0

0

Пишу прогу, которая работает с протоколом POP3. Ну, USER, PASS, STAT, LIST. Пишу на сокетах. И получается какая-то херня. send'ом отправляю команду PASS xxx, а recv'ом в ответ получаю ответ сервера на ПРЕДЫДУЩУЮ команду USER xxx. Причём, если перед send ставить ещё один recv, то он НИЧЕГО не принимает и ждёт. Получается какая-то эстонская беседа. Как победить?

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

В смысле - не там? Каждая команда заканчивается \n. Пробовал также 10, 13, 13+10. Результат один и тот же.

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

не нужно гадать. просто прочитай документацию: ftp://ftp.rfc-editor.org/in-notes/std/std53.txt

"Initially, the server host starts the POP3 service by listening on
TCP port 110. When a client host wishes to make use of the service,
it establishes a TCP connection with the server host. When the
connection is established, the POP3 server sends a greeting. The
client and POP3 server then exchange commands and responses
(respectively) until the connection is closed or aborted."

ты вычитываешь из буфера приветствие сервера которое он посылает тебе сразу после подключения ? (When the connection is established, the POP3 server sends a greeting.)

это должно выглядить так:
// подключились
$link_id = fsockopen($server, $port, $errno, $errstr, 30);
if (!$link_id)
{
$secMgr->log(1,"pop3auth serverconnect error $server: $errstr");
atkdebug("Error connecting to server $server: $errstr");
$this->m_fatalError = atktext("auth_unable_to_connect");
return AUTH_ERROR;
}

/* authenticate */
// получили приветствие от сервера (ты наверное этого не делаешь,
// поэтому у тебя на один ответ и съезжает)
$void = fgets($link_id, 1000);
// отправили _первую_ команду
fputs($link_id, "USER ".$user."\r\n");
// получили на неё ответ
$void = fgets($link_id, 1000);
// отправили _вторую_ команду
fputs($link_id, "PASS ".$passwd."\r\n");
// получили на неё ответ
$auth = fgets($link_id, 1000);
// прощаемся :)
fputs($link_id, "QUIT\r\n");
// закрыли сокет
fclose($link_id);

удачи. :)

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