Ошибка в ответе на UDP-запрос

Coagulant

Новичок
Ошибка в ответе на UDP-запрос

Задача: опросить игровой сервер (swat4) по UDP для получения строки с параметрами его текущей статистики.
Используемое мной решение:

PHP:
<?php
$rem = fsockopen ("udp://62.189.19.245", 10491, $udp_e, $udp_err);
fwrite ($rem, "\\status\\");
$result = "";
while (!feof ($rem)) {
	$buffer_in = fread ($rem, 1024);
	$result .= $buffer_in; 
	if (strstr ($result, "\\final\\\\")) break;
}
fclose ($rem);
echo $result;
?>
Проблема: результат, полученный от сервера, в половине случаев отличается от ожидаемого: часть строки $result теряется или некоторые части находятся не на своих местах, как должны быть на самом деле.

Исключая ошибку со стороны сервера, в чём может быть источник проблемы?

PS Apache 1.3.35, PHP 4.4.1
 

vadim

Guest
Coagulant
А почему именно UDP?? UDP как раз и характерен тем, что не гарантирует целостносить данных.
 

Coagulant

Новичок
vadim
Дело в том, что выбирать протокол я не в силах, ограничен возможностями игрового движка. UDP ненадежный, да. Но загвоздка не в протоколе, думаю я, а в чём-то другом.

Потому что этот же самый скрипт отлично работает на хостинге у знакомого: php: 5.1.2, Apache 2.0.x
 

ViJu

Новичок
Может поможет если отключишь/включишь QoS (Quality of Service) в свойствах сетевого подключения, но не факт
 

vadim

Guest
Coagulant
Я боюсь, что это может быть изза протокола
Неизвестно как пакеты идут на другой сервер, может они меньше узлов проходят, поэтому и меньше ошибок. Так что с другим сервером сравнивать нельзя.

Неужели они только по UDP дают связаться с ними?? Информация то текстовая, много места не занимает, смысла в этом большого нету
 

Coagulant

Новичок
vadim
Дело в том, что у игр на движке unreal информация о статусе сервера передается именно по UDP и никак иначе... Т.к. запросов о статусе сервера обычно очень много и приходят они часто, разрабы выбрали именно udp как самый быстрый.

Мой хостер: sweb.ru. Знакомый тестил на: jino-net.ru

ViJu
Серверы оба - Linux
 

vadim

Guest
А в $udp_e, $udp_err есть чтонибудь??

(Только читайте переменные после отсылки и получения данных)
 

Alexander

Новичок
Ммммм... мне приходит в голову только одно самнительное решение: -Можно считывать инфу из сокета 2 раза, сравнивать оба раза, и если они равны, то уже записывать в $result, а если нет то сравнивать еще раз, пока не совпадет. Если конечно содержимое не обновляется 10 раз в секунду... тогда можно жертвавать при сравнивание какой-либо частью, а записывать то что равно, плюс одну неправеренную часть... По идее так точность чуть повыситься... Хотя решение не из лучших...
А вобще при UDP никак нельзя расчитывать на %100 целостность пакетов, так уж он сделан...
 

vadim

Guest
Coagulant
А вы можете проверять, правильно ли данные пришли?? думаю раз 50 можно без проблем перепробывать реконнект, 1 раз должно всё в правильной форме прийти
 

Coagulant

Новичок
Alexander
В принципе, можно написать функцию, которая бы проверяла правильность стуктуры ответа сервера (все ли параметры на месте, нет ли лишних и т.п), но я специально не хочу этого делать, т.к. подобные запросы на сервер посылаются каждые 5 секунд и полученные ответы в дальнейшем отправляются на обработку. Таким образом, если ответ пришёл ошибочный, меня это совершенно не устроит.

vadim
Неизвестно как пакеты идут на другой сервер, может они меньше узлов проходят, поэтому и меньше ошибок.
Ошибок не меньше, их просто нет (по крайней мере за промежуток времени моего наблюдения) :(
 
Сверху