Создание клиент-серверного приложения

Ниже приведен пример, который иллюстрирует реализацию простого сервера, отвечающего на запросы.

В листинге надо изменить адрес и порт. Подключиться к этому серверу можно при помощи простого сетевого клиента, например, командой, telnet 192.168.1.53 10000. Конечно, в ней надо указать верные адрес и порт. Все, что будет посылаться на сервер, будет отображаться и возвращаться клиенту обратно. Для прекращения сеанса связи нужно ввести команду quit.

error_reporting (E_ALL);
/* Позволяет скрипту бесконечно удерживать связь. */
set_time_limit (0);
$address = '192.168.1.53';  /* установите свои значения */
$port = 10000;
if (($sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
   echo " Ошибка в socket(): " . strerror ($sock) . "\n";
}
if (($ret = bind ($sock, $address, $port)) < 0) {
   echo "Ошибка в bind(): " . strerror ($ret) . "\n";
}
if (($ret = listen ($sock, 5)) < 0) {
   echo "Ошибка в listen(): " . strerror ($ret) . "\n";
}
do {
   if (($msgsock = accept_connect($sock)) < 0) {
      echo "Ошибка в accept_connect(): " . strerror ($msgsock) . "\n";
      break;
   }
   do {
      $buf = '';
      $ret = read ($msgsock, $buf, 2048);
      if ($ret < 0) {
         echo "Ошибка в read(): " . strerror ($ret) . "\n";
         break 2;
      }
      if ($ret == 0) {
         break 2;
      }
      $buf = trim ($buf);
      if ($buf == 'quit') {
         close ($msgsock);
         break 2;
      }
      $talkback = "Вы ввели '$buf'.\n";
      write ($msgsock, $talkback, strlen ($talkback));
      echo "$buf\n";
   } while (TRUE);
   close ($msgsock);
} while (TRUE);
close ($sock);

Код соответствующего клиентского приложения приведен ниже.

Это приложение получает страницу через HTTP, отправляет запрос HEAD, выводит ответ и завершается.

error_reporting (E_ALL);
echo "<h2>TCP/IP Connection</h2>\n";
/* Получить порт службы WWW (iau?ii: 80). */
$service_port = getservbyname ('www', 'tcp');
/* Получить IP адрес хоста. */
$address = gethostbyname ('www.php.net');
/* Создать TCP/IP socket. */
$socket = socket (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
   echo "Ошибка в socket(): " . strerror ($socket) . "\n";
}
else {
   "socket создан: " . strerror ($socket) . "\n";
}
echo "Попытка подключиться к '$address' (порт '$service_port') ...";
$result = connect ($socket, $address, $service_port);
if ($result < 0) {
   echo "Ошибка в connect(): ($result) ". strerror($result) ."\n";
}
else {
   echo "OK.\n";
}
$in = "HEAD / HTTP/1.0\r\n\r\n";  // посылаемые данные 
$out = '';                        // буфер для приема данных
echo "Sending HTTP HEAD request...";  // послать запрос заголовка HTTP
write ($socket, $in, strlen ($in));
echo "OK.\n";
echo "Reading response:\n\n";      // принять ответ (заголовок)
while (read ($socket, $out, 2048)) {
   echo $out;
}
echo "Closing socket...";
close ($socket);
echo "OK.\n\n";

.