Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Сокеты


Автор: wsr 3.1.2006, 22:33
Привет всем!
У меня такая проблема:
Соединяюсь с сервером => посылаю запрос => читаю ответ!
дальше опять посылаю запрос, и опять читаю ответ, и вот как раз после первого получения ответа больше ничего не приходит!

Код

<?php
$header  = "Accept: */* \r\n";
$header .= "Host: samplesite.ru \r\n";

$fp = fsockopen ("site.ru", 80);
for ( $i=0; $i<100; $i++ ):
     $head  = "GET /index.php?id=".$i." HTTP/1.1\r\n";
     $head .= $header;

     fwrite ( $fp, $head );
     $data = "";
     while ( !feof ( $fp ) ) {
              $data .= fgets ( $fp, 128 );
     }

     if ( eregi ("Привет", $data) ) :
        $file = fopen ("site.txt", "a+");
        fputs ($file, $i."\n");
        fclose ($file);
     endif;
endfor;
fclose($fp);
?>


Может все дело в заголовках! Может чего-то нехватает!??
Помогите плизз!

Автор: Mal Hack 3.1.2006, 22:44
fread попробуй.

Автор: wsr 4.1.2006, 00:03
Попробовал!

Это тоже самое, что и каждый раз при новом запросе открывать сокет, и закрывать его!

Но чтение данных используя fread работает быстрее, чем открытие сокетного соединения!

Автор: Mal Hack 4.1.2006, 00:41
wsr что за бред?
Я тебе про:
Цитата(wsr @ 3.1.2006, 22:33)
$data .= fgets ( $fp, 128 );

Где ты каждый раз читаешь строку из 128 символов. А если в ней больше?

Автор: wsr 4.1.2006, 18:52
Код

while ( !feof ( $fp ) ) {
              $data .= fgets ( $fp, 128 );
     }


А не пробовал рассмотреть код полностью?
Мы дописываем каждый раз к $data данные которые прочитали, но порциями по 128 байт!
И так пока не прочитаем все данные!
Так что это не бред!

Автор: Mal Hack 4.1.2006, 19:03
Цитата(wsr @ 4.1.2006, 18:52 Найти цитируемый пост)
Мы дописываем каждый раз к $data данные которые прочитали, но порциями по 128 байт!
И так пока не прочитаем все данные!
Так что это не бред!

Мы дописываем каждый раз первые 128 байт каждой раз новой строки...

Автор: wsr 7.1.2006, 12:56
В мане читал! Может я не в том мане конечно читал, но там ни сказано, что fgets читает N байт и даже если не достиг конца строки переходит на другую!
Ну все равно! Поствил я большую длинну! И эффект такой-же!

Автор: Mal Hack 7.1.2006, 13:00
Цитата(wsr @ 7.1.2006, 12:56 Найти цитируемый пост)

Ну все равно! Поствил я большую длинну!

Либо убери ее (длину) нафиг, либо используй fread. Т.к. даже большая длина не даст тебе гарантии, что ты прочтешь ВСЮ информацию.

Попробуй перед while'ом поставить fseek( $fp , 0 );

Автор: wsr 7.1.2006, 17:19
Warning: fseek(): stream does not support seeking

Но и без fseek все pаработало!
Использую вместо fgets fread ($fp, 100000000);

Я просто знаю, сколько мне инфры придет! И это число заведомо больше!
Теперь не надо все время открывать сокетное соединени!

Спс!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)