Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: xawp.narod.ru
 Профиль | | #1
Добавлено: 08.03.11 20:46
ну, судя по результату, цикл бесконечный.

и в echo лучше пользоваться двойными кавычками.

Ответить

Номер ответа: 2
Автор ответа:
 LEX1ERS



ICQ: 4204936 

Вопросов: 38
Ответов: 100
 Профиль | | #2 Добавлено: 08.03.11 21:24
Естественно, при з-апуске скрипта, он должен ждать держать как бы связь.С самого начало то работало всё норм. Я скрипт не изменял даже сперва, он от нечего делать лагать начал. Так что делать то мне?(

Ответить

Номер ответа: 3
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 08.03.11 22:28
break из двух бесконечных циклов происходит только если socket_read прочитает 'son'. Вот он и крутит цикл. С чего бы интересно оно раньше могло работать..

Ответить

Номер ответа: 4
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #6
Добавлено: 09.03.11 22:04
То есть этот код будет ждать сообщения? странно
  1. if (false === ($buf = socket_read($msgsock, 1024))) {

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам