Сокетное программирование с PHP - PullRequest
0 голосов
/ 21 октября 2009

Я подключаюсь к удаленному сайту через сокеты. Я ожидаю определенную строку «XXX» с удаленного сайта. После получения строки я хочу отправить ответ «ACK» 200 OK обратно на удаленный сервер.

Это то, что у меня есть (предположим, сокет успешно открыт); $ fp - это ресурс (указатель) на сокет:

 while (!feof($fp)) {
   $data = fgets ($fp, 1024);
   if (strcmp("PASS",$data)==0) {
 // Send 200 OK 'ack' response to remote server
     $response = "HTTP/1.0 200 OK\r\n";
 fputs ($fp, $response);

     // Do additional processing here ...
   }
 }
 fclose($fp)

В чем я не уверен, так ли это, допустимо ли использовать fputs в (! Feof ()) в цикле while. Если с приведенным выше кодом что-то не так, я буду признателен, если кто-нибудь укажет на это (то есть, если он будет написан лучше).

Ответы [ 2 ]

3 голосов
/ 21 октября 2009

Это выглядит хорошо, но если вам нужна только одна строка, вы можете выйти из цикла чтения, как только найдете ее.

, например

while (!feof($fp)) {
   $data = fgets ($fp, 1024);
   if (strcmp("PASS",$data)==0) 
      break;
 }

$response = "HTTP/1.0 200 OK\r\n";
fputs ($fp, $response);

fclose($fp);
1 голос
/ 21 октября 2009

Если ваша «дополнительная обработка» в цикле означает, что вы будете читать больше из дескриптора сокета, то я бы сказал, что вы должны закончить чтение всего его ответа, прежде чем отправлять что-то обратно.

Как насчет установки статуса в этом цикле, чтобы указать, что вы собираетесь отправить обратно 200, когда закончите обрабатывать ответ этого сервера для вас. Затем, когда вы все закончите с циклом, выдает ответ.

О, предыдущий ответ говорит об одном и том же, за исключением того, что вы не хотите прерывать цикл только потому, что нашли «PASS».

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