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

Ваш аккаунт

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

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

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

Программирование сокетов на php

1.3K
14 октября 2003 года
view
148 / / 14.10.2003
Доброго вам!
Помогите, плз.
Я пытаюсь написать скрипт, который будет обращаться к почтовому серверу по протоколу pop3, для получения почты. Проблема в том, что читая в цикле ответ сервера, программа зависает в ожидании.

while(!feof($fp))
echo fread($fp, 128);

Понятно, что конца файла там не видно, тогда я делаю так:

while(!feof($fp) && $out != "\n")
echo ($out = fread($fp, 1));

Второй вариант не работает, когда я обращаюсь к виндовому почтовому серверу :(

Возможно я что-то делаю не правильно.
1.3K
14 октября 2003 года
view
148 / / 14.10.2003
Sorry
Вместо fread я использую fgets
250
14 октября 2003 года
Joker
1.4K / / 20.02.2000
а почему конца файла не видно ?
 
Код:
while(!feof($fp)) {
      print fgets($fp,1025);
          }

У тебя вообще конект происходит что в заголовке ? $g=fgets($fp,1025);
1.9K
15 октября 2003 года
Cranky
70 / / 05.10.2003
А где сама строка открытия сокета?
$fp=fsockopen($адрес, $запрос, $порт);
1.3K
15 октября 2003 года
view
148 / / 14.10.2003
Цитата:
Originally posted by Cranky
А где сама строка открытия сокета?
$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() вызвать один раз после всех комманд - то все как положено: читались все ответы сервера и соединение закрывалось.

1.9K
15 октября 2003 года
Cranky
70 / / 05.10.2003
Ну ты даешь! Ты пытаешся взять ответ у сервера раньше чем отослал запрос!
{
while(!feof($fp))
echo fgets($fp, 1024);
}
засунь эту штуку в самый конец. А лучше вот эту:
while(!feof($fp)) {
$результат.=fread($fp,4096);
}
fclose($fp);
echo($результат);
1.3K
16 октября 2003 года
view
148 / / 14.10.2003
Дело в том, что как только я соединяюсь с сервером по POP3, он первый выдает приглашение. Это раз. А во-вторых, данный простой пример действительно будет работать, если я вначале отправлю все команды серверу, а потом разом прочитаю все ответы (это при условии, если все команды будут правильными и не произойдет никакой сбой). Но в реальной жизни требуется анализ каждого ответа сервера. А так же есть команды, зависящие от текущего положения дел. Например, я узнаю, что у меня в ящике лежит 10 писем и захочу их прочитать. Можно, конечно, сначала это узнать, после чего разорвать соединение, проанализировать результат и соединиться снова, но это не правильно :( .
1.9K
16 октября 2003 года
Cranky
70 / / 05.10.2003
Напиши функцию, которой передаются запрос в переменной, а функция будет открывать сокет и получать ответ и возвращять. Если не хочешь по 100 раз открывать сокет пользуйся функцией открытия постоянного соединения pfsockopen(все праметры такиеже как у fsockopen);
1.3K
16 октября 2003 года
view
148 / / 14.10.2003
Спасибо!

Я понял свою ошибку :o. Вместо \n мне нужно было каждую команду завершать \r\n. Мой пример работал на Линуксовом сервере, а на виндовом - нет. Это ввело меня в заблуждение :x
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог