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