Проблема с сокетами

GrayMaster

Новичок
Проблема с сокетами

Добрый день !
Выполняю такой код:

PHP:
$host = "localhost";
$port = "80";

$sock = fsockopen($host, $port, $errno, $errstr, 3);
if (!$sock) die("$errstr ($errno)\n");

fputs($sock, "GET /index.php HTTP/1.0\r\n");
fputs($sock, "Host: localhost\r\n");
fputs($sock, "Accept: */*\r\n");
fputs($sock, "\r\n");

while (!feof($sock))
  echo fgets($sock);

fclose($sock);
Программа просто зависает когда выполняется цикл:
while (!feof($sock))
echo fgets($sock);

Как буд-то прога не может получить информацию с сервера... Соединение есть. Если пишу буз цикла несколько строк "echo(fgets($sock));", то всё нормально работает. А циклом считать весь файл не получается.

Это не работает только на моём компе непойму почему. Windows XP SP 2, Apache 2.0.43, PHP 4.3.0.0

В чём может быть дело ? Может что-то не так настроено !?
 

GrayMaster

Новичок
Пробелма когда я подсоединяюсь только к своему компу - localhost'у.

Вот такой код работает без проблем:
PHP:
<?php
$host = "www.phpclub.ru";
$port = "80";

$sock = fsockopen($host, $port, $errno, $errstr, 3);
if (!$sock) die("$errstr ($errno)\n");

fputs($sock, "GET /index.php HTTP/1.0\r\n");
fputs($sock, "Host: [url]www.phpclub.ru\r\n[/url]");
fputs($sock, "Accept: */*\r\n");
fputs($sock. "Connection: close\r\n");
fputs($sock, "\r\n");

while (!feof($sock))
  echo fread($sock, 1024);

fclose($sock);
?>
В чём может быть дело ? врят-ли в Apache... Ведь браузер то читает нормально. Я их Delphi пробывал тоже всё нормально...

-~{}~ 16.03.05 18:40:

Кстати вполне возможно что это стало после того как я апгрейдил винду до SP 2... Вообще на Win XP у меня до этого всё работало. Апгрейдил уже давно непомню :(
 

Tor

Новичок
во втором сервис паке с ХР файрвол по-умолчанию не принимает внешние коннекты
 

GrayMaster

Новичок
Ну совсем за ломака меня держишь...
Я его с самого начала отрубил. и Outpost юзаю...
В файрволе нет проблем.
Соединение проходит я ведь сказал.
 

Макс

Старожил PHPClub
недавно тоже с похожим столкнулся, заработал такой код:
PHP:
            stream_set_timeout($fp, 5);
            $status = socket_get_status($fp);
            stream_set_blocking ($fp, 0);
            while (!feof($fp) && !$status['timed_out']) {
               $lines .= fgets($fp, 1024);
               $status = socket_get_status($fp);
            }
 

Tor

Новичок
а телнет из коммандной строки получает страницу?
 

GrayMaster

Новичок
Опки... А вот Максу огромное пасиба !!
У меня просто почему-то долго считывается страница, из-за этого мой пример глюкал. Когда 30 секов проходило и скрипт останавливался, на экране было тока половина содержимого...

-~{}~ 16.03.05 19:28:

ааа... нет :(
Теперь у меня вся страница загружается, но всё-равно цикл зависает !!
Fatal error: Maximum execution time of 30 seconds exceeded in C:\home\localhost\www\ddlist.ws\localhost\old_site\php\2\test\get_http.php on line 19


PHP:
<?php
$host = "localhost";
$port = "80";

$sock = fsockopen($host, $port, $errno, $errstr, 3);
if (!$sock) die("$errstr ($errno)\n");

fputs($sock, "GET [url]http://localhost/[/url] HTTP/1.1\r\n");
fputs($sock, "Host: localhost\r\n");
fputs($sock, "Accept: */*\r\n");
fputs($sock. "Connection: close\r\n");
fputs($sock, "\r\n");

stream_set_timeout($sock, 5);
$status = socket_get_status($sock);
stream_set_blocking($sock, 0);

while (!feof($sock) && !$status['timed_out']) {
        echo fgets($sock, 1024);
        $status = socket_get_status($sock);
}

fclose($sock);
?>
 

Макс

Старожил PHPClub
fputs($sock. "Connection: close\r\n")
просто у тебя в этой строке опечатка.
Если ее исправить, то у меня твой код работает даже без моих дополнений.
while(!feof($sock)) echo fgets($sock, 1024);
 

GrayMaster

Новичок
Нада же так натупить :)
Да точно. А я и не заметил, а PHP её не выводит как Fatal Error :)
Всё работает ! Всем больше спасибо ! Очень благодарен !
 
Сверху