<?php
error_reporting(E_ALL);
 
$address = '127.0.0.1';
$port = 1337;

$sock = socketInit($address, $port);
 
do {
	if (($msgsock = socket_accept($sock)) === false) {
		echo "Не удалось выполнить socket_accept(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
	}
 
	socketWrite($msgsock, "Welcome\r\n\r\n");

	$buf = '';
 
	foreach (readSocket($msgsock) as $buffer) {
		$buf .= $buffer;
	}

	socketWrite($msgsock, $buf);

	socket_close($msgsock);
} while (true);
 
socket_close($sock);
 
function socketWrite($msgsock, $buffer) {
	$length = strlen($buffer);
 
	while ($bytesSent = socket_write($msgsock, $buffer)) {
		if ($bytesSent == $length) {
			echo "all bytes have been sent \n";
			break;
		} else {
			$buffer = substr($buffer, $bytesSent);
		}
	}
 
	if ($bytesSent === false) {
		echo "Не удалось записать данные в сокет, причина:" . socket_strerror(socket_last_error());
		socket_close($msgsock);
	}
}

function socketInit($address, $port) {
	if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
		echo "Не удалось создать сокет, причина: " . socket_strerror(socket_last_error()) . "\n";
		die;
	}

	if (socket_bind($sock, $address, $port) === false) {
		echo "Не удалось привязать сокет к адрресу, причина: " . socket_strerror(socket_last_error()) . "\n";
		die;
	}

	if (socket_listen($sock, 5) === false) {
		echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
		die;
	}

	return $sock;
}

function readSocket($msgsock) {
	do {
		if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
			echo "не удалось прочитать сокет, причина: " . socket_strerror(socket_last_error($msgsock));
			break;
		}
 
		$buf = trim($buf);
 
		if ($buf == "") {
			break;
		}

		yield $buf;

		if (preg_match('/\n/', $buf)) {
			break;
		}

	} while (true);
}