Сокеты, как понять что отправить read или write в сокет?



@fastboot

Сервер в цикле прослушивает сокет, 5 соед. максимум

while (true)
{
	echo 'Accept socket ... ';
	if (($msgsock = socket_accept($sock)) < 0)
	{
		throw new Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."n");
	}
	else
	{
		echo "OKn";
	}
	
	echo "Say to client ($message) ... ";
	socket_write($msgsock, $message, strlen($message));
	echo "OKn";
	
	while ( $buf = socket_read($msgsock, 1024) )
	{
		#echo 'Client said: ';
		if (false === $buf )
		{
			throw new Exception('socket_read() failed: '.socket_strerror(socket_last_error())."n");
		}
		else
		{
			$message = $buf;
			echo $buf;
		}
	}
}

Клиент на машине

function socket_echo ( $MESSAGE )
{
	#GLOBAL $SOCKET;
	$address="127.0.0.1"; //Адрес работы сервера
	$port = 12345; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
	$result = socket_connect($socket, $address, $port);
	socket_write($socket, $MESSAGE, strlen($MESSAGE));
	socket_shutdown($socket, STREAM_SHUT_WR); 
}

613144165d35d609475364.png

ВОПРОС:
1) хочу понять или как правильно прослушивать соединения — он подключился что бы слушать ответ сервера? или он подключился и ждёт когда я ему отвечу?

2) как правильно закрывать соединение с сокетом? (на стороне клиента)


Решения вопроса 0


Ответы на вопрос 1



@Vamp

1. Порядок общения устанавливается протоколом. То есть вы сами должны для себя придумать протокол и в соответствии с ним писать логику обработки и на сервере, и на клиенте. Тогда у вас не возникнет неоднозначных ситуаций и вопросов.

Например, в http протоколе сервер изначально работает в режиме прослушивания. То есть сразу после подключения к серверу клиент обязан первый отправить данные (запрос). После отправки запроса сервер с клиентом как бы меняются ролями — клиент переходит в режим прослушивания и ждёт данных от сервера (ответ), а сервер отправляет ответ по мере готовности. После отправки ответа опять идёт смена ролей. И так продолжается пока одна из сторон не закроет сокет.

2. Сокет закрывается функцией socket_close. На стороне сервера это делается той же функцией.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *