fork download
  1. <?php
  2.  
  3. $address = '127.0.0.1';
  4. $port = 1337;
  5.  
  6. if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
  7. echo "Не удалось создать сокет, причина: " . socket_strerror(socket_last_error()) . "\n";
  8. die;
  9. }
  10.  
  11. if (socket_bind($sock, $address, $port) === false) {
  12. echo "Не удалось привязать сокет к адрресу, причина: " . socket_strerror(socket_last_error()) . "\n";
  13. die;
  14. }
  15.  
  16. if (socket_listen($sock, 5) === false) {
  17. echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
  18. die;
  19. }
  20.  
  21. do {
  22. if (($msgsock = socket_accept($sock)) === false) {
  23. echo "Не удалось выполнить socket_accept(): причина: " . socket_last_error($sock) . "\n";
  24. break;
  25. }
  26.  
  27. $request = "";
  28.  
  29. while ($read = socket_read($msgsock, 2)) {
  30. //без этой функции мы повиснем на чтении из сокета навечно, но почему-то если объявить её до этого цикла, то даные из сокета не прочтутся
  31. $request .= $read;
  32. }
  33.  
  34. if ($read === false) {
  35. echo "ошибка чтения из сокета, причина: " . socket_last_error($msgsock) . "\n";
  36. }
  37.  
  38. $response = "HTTP/1.1 200 Ok\r\n";
  39. $response .= "Content-Type: text/html; charset=UTF-8\r\n\r\n";
  40. $response .= "<!DOCTYPE html><html><head></head><body>$request</body></html>";
  41.  
  42. socketWrite($msgsock, $response);
  43. } while (true);
  44.  
  45. socket_close($sock);
  46.  
  47. function socketWrite($msgsock, $buffer) {
  48. $length = strlen($buffer);
  49. $bytesSent = socket_write($msgsock, $buffer, $length);
  50.  
  51. if ($bytesSent === false) {
  52. echo "Не удалось записать данные в сокет, причина:" . socket_strerror(socket_last_error());
  53. socket_close($msgsock);
  54. } elseif ($bytesSent < $length) {
  55. $newBuffer = substr($buffer, $bytesSent);
  56. socketWrite($msgsock, $newBuffer);
  57. } else {
  58. echo "all bytes have been sent \n";
  59. //здесь был sleep(10) до того, как я стал читать данные из сокета. Без socket_read или sleep сокет как будто закрывается до того, как клиент успевает принять респонс, что приводит к ошибке в браузере
  60. socket_close($msgsock);
  61. }
  62. }
Time limit exceeded #stdin #stdout 5s 61648KB
stdin
Standard input is empty
stdout
Standard output is empty