Попытка записать данные в сокет и прочитать ответ.
$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" только после заголовка.