powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с веб сокетом
6 сообщений из 6, страница 1 из 1
Помогите с веб сокетом
    #38579737
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал вот такой сервер:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?php
$server = stream_socket_server("tcp://0.0.0.0:1234", $errno, $errstr);
$connects = array();
while (true) {
	$read = $connects;	//формируем массив прослушиваемых сокетов:
	$read []= $server;
	$write = $except = null;
	stream_select($read, $write, $except, null);
	if (in_array($server, $read)) {//есть новое соединение
		$client = stream_socket_accept($server, -1);//принимаем новое соединение
		$connects[] = $client;//добавляем его в список необходимых для обработки
		$read[] = $client;//добавляем его в список необходимых для обработки ????????????
		unset($read[ array_search($server, $read) ]);
	}
	foreach($read as $client) {//обрабатываем все соединения
		$buffer = fread($client, 100000);
		fwrite($client, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n$buffer");
		fclose($client);
		unset($connects[ array_search($client, $connects) ]);
	}
}



Посылаю в него запрос методом POST с веб-страницы:
Код: html
1.
2.
3.
4.
5.
6.
<body>
	<form action = "http://govnoforum.ru:1234" method=POST>
		<textarea NAME='text'></textarea>
		<input type=submit>
	</form>
</body>



В итоге получается что переменная $buffer иногда содержит заголовки и тело запроса, а иногда только заголовки без тела запроса. Закономерности я не нашел. Бывает три раза подряд срабатывает с телом, иногда по пять раз без тела приходит, промежутки времени между удачными запросами всегда разные если долбить не переставая, иногда до 8 секунд.

В чем ошибка?
...
Рейтинг: 0 / 0
Помогите с веб сокетом
    #38579813
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При получение данных через сокет - данные буферизируются.
Пока сокет не забуферизирует н-ое количество байт, он не отдаст их функции fread().

И наоборот, отправляющая сторона тоже может посылать данные кусочками.
Как только сокет сочтет, что буфер заполнен - пакет данных в буфере становится доступным для вычитывания функцией fread().
Если в буфер сокета пришло МЕНЬШЕ данных, чем указано во втором параметре fread() то функция не станет ждать и вычитывать остальные нехватающие данные


Поэтому при чтении из сокета принято вручную в цикле контролировать объем вычитанной информации и дочитывать, если пришло меньше, чем надо. Либо использовать специальные функции для работы с потоками типа http://www.php.net/manual/en/function.stream-get-meta-data.php
...
Рейтинг: 0 / 0
Помогите с веб сокетом
    #38579836
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том что stream_get_meta_data всегда возвращает unread_bytes = 0.

Делал через fgets в цикле. Получалось что буфер считвался полностью, потом я вызвал fgets еще раз, программа зависла на несколько(много) секунд и потом считала остальные данные, наверное когда соединение закрылось.

Но почему буфер обрывается именно после заголовков на \r\n\r\n ?
И как дочитать все данные без ожидания в несколько секунд?
Ведь отдающая сторона отправила весь объем, это же браузер с обычным POST запросом. ИМХО
...
Рейтинг: 0 / 0
Помогите с веб сокетом
    #38579964
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал размер считываемого блока поменьше, помогло немного, считывается теперь полностью до конца.
Но как остановить чтение, как определить когда достигнут конец?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?php
$server = stream_socket_server("tcp://0.0.0.0:1234", $errno, $errstr, STREAM_SERVER_LISTEN | STREAM_SERVER_BIND);
$connects = array();
while (true) {
	$read = $connects;	//формируем массив прослушиваемых сокетов:
	$read []= $server;
	$write = $except = null;
	stream_select($read, $write, $except, null);
	if (in_array($server, $read)) {//есть новое соединение
		$client = stream_socket_accept($server, -1);//принимаем новое соединение
		$connects[] = $client;//добавляем его в список необходимых для обработки
		$read[] = $client;//добавляем его в список необходимых для обработки ????????????
		unset($read[ array_search($server, $read) ]);
	}
	foreach($read as $client) {//обрабатываем все соединения
		$buf = "";
		while ( 1 ) {
			$buf .= fread($client, 1);// как как определить когда достигнут конец?????????
		}
		fwrite($client, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n$buf");
		fclose($client);
		unset($connects[ array_search($client, $connects) ]);
	}
}
...
Рейтинг: 0 / 0
Помогите с веб сокетом
    #38579975
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

зачем ты вообще это пишешь?

-если нужен нормальный веб сервер - скачай готовый. вариантов в нете много.
-если хочешь разобраться сам - начни с теории. без нее сервер получится дырявый, глючный и медленный.
...
Рейтинг: 0 / 0
Помогите с веб сокетом
    #38580005
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу разобраться.
Так я и начал с теории. В букваре нашел этот простой пример, и он не работает. В чем ошибка у меня?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с веб сокетом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]