while(!feof($fp)) {
print fgets($fp,1025);
}
Программирование сокетов на php
Помогите, плз.
Я пытаюсь написать скрипт, который будет обращаться к почтовому серверу по протоколу pop3, для получения почты. Проблема в том, что читая в цикле ответ сервера, программа зависает в ожидании.
while(!feof($fp))
echo fread($fp, 128);
Понятно, что конца файла там не видно, тогда я делаю так:
while(!feof($fp) && $out != "\n")
echo ($out = fread($fp, 1));
Второй вариант не работает, когда я обращаюсь к виндовому почтовому серверу :(
Возможно я что-то делаю не правильно.
Вместо fread я использую fgets
Код:
У тебя вообще конект происходит что в заголовке ? $g=fgets($fp,1025);
$fp=fsockopen($адрес, $запрос, $порт);
Цитата:
Originally posted by Cranky
А где сама строка открытия сокета?
$fp=fsockopen($адрес, $запрос, $порт);
А где сама строка открытия сокета?
$fp=fsockopen($адрес, $запрос, $порт);
Вот что я делаю:
function recv($fp)
{
while(!feof($fp))
echo fgets($fp, 1024);
}
$fp = fsockopen($host, 110, $errno, $errstr, 10);
if(!$fp)
echo $errstr."(".$errno.")\n";
else
{
recv($fp);
fputs($fp, $user);
recv($fp);
fputs($fp, $password);
recv($fp);
fputs($fp, "STAT");
recv($fp);
fputs($fp, "QUIT");
}
Я пытался использовать
set_socket_blocking($fp, false);
и смотрел коды выводимых символов. Если режим не блокирующий - читались нули. Если обычный режим - просто зависает. :(
При этом, если функцию recv() вызвать один раз после всех комманд - то все как положено: читались все ответы сервера и соединение закрывалось.
{
while(!feof($fp))
echo fgets($fp, 1024);
}
засунь эту штуку в самый конец. А лучше вот эту:
while(!feof($fp)) {
$результат.=fread($fp,4096);
}
fclose($fp);
echo($результат);
Дело в том, что как только я соединяюсь с сервером по POP3, он первый выдает приглашение. Это раз. А во-вторых, данный простой пример действительно будет работать, если я вначале отправлю все команды серверу, а потом разом прочитаю все ответы (это при условии, если все команды будут правильными и не произойдет никакой сбой). Но в реальной жизни требуется анализ каждого ответа сервера. А так же есть команды, зависящие от текущего положения дел. Например, я узнаю, что у меня в ящике лежит 10 писем и захочу их прочитать. Можно, конечно, сначала это узнать, после чего разорвать соединение, проанализировать результат и соединиться снова, но это не правильно :( .
Напиши функцию, которой передаются запрос в переменной, а функция будет открывать сокет и получать ответ и возвращять. Если не хочешь по 100 раз открывать сокет пользуйся функцией открытия постоянного соединения pfsockopen(все праметры такиеже как у fsockopen);
Я понял свою ошибку :o. Вместо \n мне нужно было каждую команду завершать \r\n. Мой пример работал на Линуксовом сервере, а на виндовом - нет. Это ввело меня в заблуждение :x