PHP: Connection: keep-alive проблема чтения данных сокета - PullRequest
0 голосов
/ 05 марта 2010

Попытка записать данные в сокет и прочитать ответ.

$packet = "GET /get-database HTTP/1.1\r\n";
$packet .= "Host: 192.168.3.136:3689\r\n";
//$packet .= "Accept-Encoding: gzip\r\n";
$packet .= "Viewer-Only-Client: 1\r\n";
$packet .= "Connection: keep-alive\r\n\r\n";

socket_write($socket, $packet, strlen($packet));

do{
    $buf = "";
    $buf = socket_read($socket, 4096);
    $data .= $buf;
}while($buf != "");

echo "$data\r\n\r\n";

Если я установлю Соединение на close, тогда оно будет работать, и я смогу прочитать ответ. Проблема в том, что после того, как я прочитал данные, мне нужно записать обратно в сокет. Ответ содержит идентификатор, который мне нужно отправить обратно для проверки. Если я пишу серверу на двух отдельных сокетах, он отклоняет контрольный пост обратно. Поэтому я могу только предположить, что мне нужно публиковать сообщения на том же «открытом соединении» или «сеансе»

Есть мысли?

Я хотел бы выяснить, почему я не могу читать из сокета с Connection: keep-alive

####### РЕДАКТИРОВАТЬ

По этому вопросу произошли небольшие изменения. Я пытаюсь сделать это очень просто, чтобы я мог точно определить проблему:

Прямо сейчас мой код выглядит так:

$fp = pfsockopen("192.168.3.136", "3689");
$content = "GET /login?id=a90347 HTTP/1.1\r\n";
$content .= "Connection: keep-alive\r\n\r\n";

fputs($fp, $content);

while (!feof($fp)) {
    echo fgets($fp, 8192);
}

Что происходит, как только я выполняю свои команды, я получаю от сервера заголовок ответа, который выглядит следующим образом:

HTTP/1.1 200 OK
Date: Fri, 05 Mar 2010 22:05:47 GMT
RIPT-Server: iTunesLib/3.0.2 (Mac OS X)
Content-Type: application/x-dmap-tagged
Content-Length: 32

И тогда мой курсор просто сидит там. Через 15 секунд или минут я иногда получаю контент, но я все еще застрял в цикле while.

Кто-нибудь знает, если после того, как сервер отправил заголовок ответа, должен ли я отправлять ему что-то обратно, чтобы он знал, что я готов к содержимому?

Опять же, я не думаю, что это так, поскольку, когда я просматриваю пакеты в сети, я вижу весь ответ. Это и тот факт, что я иногда получаю содержание ответа. Это правда, что PHP не может справиться с этим, или я просто не в себе.

Все еще нужна помощь .....: (

Рабочий код
$fp = pfsockopen("192.168.3.136", "3689");
$header = "GET /login?id=5648349 HTTP/1.1\r\n";
$header .= "Connection: keep-alive\r\n\r\n";

fputs($fp, $header);

$headers = array();

while(true){
    $line = fgets($fp, 8192);
    if($line == "\r\n"){ break; }
    $line_parts = explode(': ',$line);
    echo $line_parts[1]."\r\n";
  $headers[$line_parts[0]] = $line_parts[1];
}
$content = fread($fp,intval($headers['Content-Length']));
echo $content;

Теперь мне нужно с осторожностью относиться к тесту "\ r \ n", так как я уверен, что некоторые ответы могут отправлять "\ n" только после заголовка.

1 Ответ

2 голосов
/ 05 марта 2010

Вы пытались установить сокет в неблокирующий режим?

socket_set_nonblock($socket);

РЕДАКТИРОВАТЬ1: ОК. Просто догадка ... попробуй это ...

$fp = pfsockopen("192.168.3.136", "3689");
$content = "GET /login?id=a90347 HTTP/1.1\r\n";
$content .= "Connection: keep-alive\r\n\r\n";

fputs($fp, $content);

$headers = array();

do
{
  $line = fgets($fp, 8192);
  $line_parts = ecplode(': ',$line);
  $headers[$line_parts[0]] = $line_parts[1];
} while($line != '');

$content = fread($fp,intval($headers['Content-Length']));

echo $content;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...