Member 13072690 Ответов: 2

Как сломать socket_accept в PHP?


Я занимаюсь проектом, связанным с PHP-сокетом. Моя цель состоит в том, что я покажу все клиенты, подключенные к серверу, и покажу их в html-файле. Однако, если я помещу функцию socket_accept () в цикл while, она не сломается, когда ни один клиент не подключится. Теперь я хочу, чтобы цикл while принимал только всех клиентов за 10 секунд, а затем экспортировал результат? Как сломать socket_accept в php?
<pre><?php

error_reporting(E_ALL);	
/* Allow the script to hang around waiting for connections. */
set_time_limit(10);

	/* Turn on implicit output flushing so we see what we're getting
	* as it comes in. */
	ob_implicit_flush();
	
	$address = "103.1.239.148";
	$port = 10000;
	// Maximum device
	$maxdevice = 5;
	
	// Create Socket
	$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
	if ($sock === false) {
		echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
	}
	
	if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { 
		echo socket_strerror(socket_last_error($sock)); 
		exit; 
	}
	
	// Bind Socket to port
	if (socket_bind($sock, $address, $port) === false) {
		echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
	}
	
	// Start listening for connection
	if (socket_listen($sock, $maxdevice) === false) {
		echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
	}
	
	// Handling connection from client
	$i=0; // Initial count variable 
	while (true)
	{
		$msgsock[++$i] = socket_accept($sock); // msgsock is a client connect to webserver
		if ($msgsock[$i] === false) {
			echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
			break;
		}
		$senddata="L";
		socket_write($msgsock[$i], $senddata, strlen($senddata)) or die("Couldn't write to client");
		$receive=socket_read($msgsock[$i],2048,PHP_BINARY_READ) or die ("Couldn't read from client");
		if ($receive !="")
		{
			include ("list.html");
		}
		if ($i==$maxdevice)
			break;
		socket_close($msgsock[$i]);  // Close connect of client
	} 
	socket_close($sock);  // Close socket of server
	?>


Что я уже пробовал:

Я пробовал set_time_limit (), но он не работает нормально.

2 Ответов

Рейтинг:
2

Jochen Arndt

Неправильный подход. Если вы прекратите прием на 10 секунд, клиенты могут столкнуться с тайм-аутами.

Думай о том, чего ты хочешь.

С вашим фактическим кодом также может быть одновременно подключен только один клиент.
Так что "показывать всех клиентов, подключенных к серверу" не имеет смысла.

Поскольку ваше общение очень короткое, а затем закрытое, список будет содержать одного клиента в течение очень короткого времени. Если вы действительно хотите этого, то добавьте клиента в список, когда accept() возвращает и извлекает его при закрытии гнезда.

Если вы хотите отслеживать список подключений, создайте список и добавьте клиентов, когда они подключаются и еще не перечислены. Это может быть опционально ограничено таймаутом "последнего просмотра". Затем сохраните также время подключения, удалите клиентов из списка через некоторое время и обновите записи списка для клиентов, которые уже находятся в списке.


Рейтинг:
1

Member 13072690

Спасибо, я сделал это с помощью функции socket_select.