Страница: 1 |
Страница: 1 |
Вопрос: php & server (winsock) Бесконечный цикл
Добавлено: 08.03.11 19:59
Автор вопроса: LEX1ERS | ICQ: 4204936
Добрый день, вот я и добрался до этого момента уже вплотную, ранее я создавал тему про Чат, Клиент на vb6 и php скрипт сервера.
Нашел хостинг с поддержкой сокетов (было трудно, так как даже и у платных не всегда модули сокетов есть) Ну да ладно, ближе к делу.
Нашел скрипт сервера на сокете, программа клиент уже сделана на vb6.Но к сожалению, скрипт почему то работает не так как хочеться, с самого начала он работал вполне хорошо, без лагов (возможно у меня не было подключения к интернету в тот момент, тест был на денвере, и работало всё замечательно!)Работа скрипта была такая:
1. Создает сокет.
2. Ждет подключения клиента.
3. "переписка" сервера с клиентом и наоборот.
4. При команде от клиента "son" сервер сокет закрывался.
Ну скрипт сошёл сума %)Теперь скрипт чувствует что к нему уже подключен клиент (хотя таковой клиент у меня даже не был запущен, не говорю уж о подключению к сокету)
Ну и в итоге переписка становитца бесконечным циклом.
Отмучился пару дней в раздумье, даже не понял в чем может быть проблема. Что на денвере что на хостинге, скрипт ведет "бесконечную" переписку.
Вот код:
<?
header('Content-Type: text/plain;');
error_reporting(E_ALL ^ E_WARNING);
set_time_limit(0);
ob_implicit_flush();
$address = 'lexters1';
$port = 1000;
echo "-= Cервер =-\n Порт $port\n Адресс $address \n\n";
try {
echo 'Cоздание сокета ... ';
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
} else {
echo "OK\n";
}
echo 'Привязка сокета ... ';
if (($ret = socket_bind($sock, $address, $port)) < 0) {
} else {
echo "OK\n";
}
echo "Количество клиентов(макс. 5)";
if (($ret = socket_listen($sock, 5)) < 0) {
} else {
echo "\n";
}
do {
echo "Подключен Клиент ... ";
if (($msgsock = socket_accept($sock)) < 0) {
} else {
echo "OK \n";
}
$msg = "Привет Клиент! \n";
echo "Написал клиенту: $msg";
socket_write($msgsock, $msg, strlen($msg));
do {
echo 'Клиент написал: ';
if (false === ($buf = socket_read($msgsock, 1024))) {
} else {
//if (strlen($buf) < 2) {
//break 2;
//echo "Было отправленно пустое сообщение! Цикл отключен!";
//continue;
//} else {
echo $buf."\n";
}
//}
if ($buf == 'son') {
socket_close($msgsock);
break 2;
}
echo "Написал клиенту: $msg";
socket_write($msgsock, $buf, strlen($buf));
echo "\n";
} while (true);
} while (true);
} catch (Exception $e) {
echo "\nError: ".$e->getMessage();
}
if (isset($sock)) {
echo 'Close socket ... ';
socket_close($sock);
echo "OK\n";
}
?>
Менял, редактировал много раз, бестолку, причины так и не нашёл. Порт с адресом менял на любой, всё тот же безумный результат.
Помоги пожалуйста, я не могу понять в чем проблема.
P.S. вот наглядный пример поведения скрипта на хостинге http://setdams.110mb.com
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #1
Добавлено: 08.03.11 20:46
ну, судя по результату, цикл бесконечный.
и в echo лучше пользоваться двойными кавычками.
Номер ответа: 2
Автор ответа:
LEX1ERS
ICQ: 4204936
Вопросов: 38
Ответов: 100
Профиль | | #2
Добавлено: 08.03.11 21:24
Естественно, при з-апуске скрипта, он должен ждать держать как бы связь.С самого начало то работало всё норм. Я скрипт не изменял даже сперва, он от нечего делать лагать начал. Так что делать то мне?(
Номер ответа: 3
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #3
Добавлено: 08.03.11 22:28
break из двух бесконечных циклов происходит только если socket_read прочитает 'son'. Вот он и крутит цикл. С чего бы интересно оно раньше могло работать..
Номер ответа: 4
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #4
Добавлено: 08.03.11 22:42
(вполне вероятно я чего-то не понял)
Номер ответа: 5
Автор ответа:
LEX1ERS
ICQ: 4204936
Вопросов: 38
Ответов: 100
Профиль | | #5
Добавлено: 09.03.11 03:00
Видимо чуть не так понял, хотя хз))
скрипт сперва как делал, пошагово:
1. Включал сокет
2. Ждал подключение. Если подключение клиента есть то выполняетца цикл (при этом цикл выполнялся не бесконечно, а он повторялся пошагово. Т.е. Если сообщение пришло от клиента то цикл на ответ клиенту выполнялся 1 раз, как бы отвечая одним сообщением(что то вроде таймера приема стояло) И при этом цикл(таймер) снова ждал сообщения от клиента, как приходило от него сообщения, то сервер снова ему отправлл одно сообщения. и т.д. вообщем.
2.1 А если сообщения от клиента не приходил, то скрипт ждал этого момента когда от клиента придет сообщения и он выполнит цикл...
Ну вообщем так сперва было, когда скрипт не лагал
Номер ответа: 6
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #6
Добавлено: 09.03.11 22:04
То есть этот код будет ждать сообщения? странно