deamon, проблема

Artik

Новичок
deamon, проблема

PHP:
<?
///////////////////////
$ip 	= '10.0.0.60';
$port 	= 9876;
///////////////////////

set_time_limit(20);

error_reporting (E_ALL);

for ($i=0;$i<50;$i++){
echo "<!-- -->";
}
flush();

echo "Go...<br>";
flush();

$listen = socket_create (AF_INET, SOCK_STREAM, 0);
socket_set_option($listen, SOL_SOCKET, SO_REUSEADDR, 1);
$ret = socket_bind ($listen, $ip, $port);
$ret = socket_listen ($listen, 5);


$clients = Array();

while (1==1)
{
$set = array_merge($listen, $clients);
	if (socket_select($set, $set_w = NULL, $set_e = NULL, 1, 0) > 0)
	{
		foreach ($set as $sock)
		{
			if ($sock == $listen)
			{
				if (($msgsock = socket_accept($listen)) < 0)
				{
				}
				else
				{
				$clients[$msgsock] = $msgsock;
				socket_getpeername($msgsock, $addr);
					foreach ($clients as $tsock)
					{
					$txt = "$addr conected...\n";
					socket_write($tsock, $txt);
					}
				echo $txt . "<br>";
				flush();
				}
			}
		}

$read = socket_read($msgsock, 1024);

		$txt = "$addr $read\n";
			foreach ($clients as $tsock)
			{
			socket_write($tsock, $txt);
			}
		echo $txt . "<br>";
		flush();
	}
		

}
?>
Запускаю демон, все работает нормально...
Открываю одно окно telnet доступа к демону пишу - вижу, работает отлично...
Открываю второе окно telnet - пишу, вижу и первым и вторым телнетом...
Перехожу на первый телнет - пишу - и не пишет некуда.
Где ошибка/недоработка?

И еще, как сделать что б когда кто то разрывает соединение то его что б удаляло с массива $clients ( unset($clients[$msgsock]); ) и писало всем что вышел такойто айпи...
Что б удаляло с массива и писало это не проблема, но вот что б определяло кто разорвал соединение - незнаю...
 

Acabar

Новичок
бвах, по поводу второго, поищи по форуму, обсуждалась эта тема. От себя скажу, можешь сделать скрытый фрэйм на каждой странице, который 1000 раз в секунду будит обновляться и проверять вышел ли пользователь или нет ;]

А по поводу первого, лень код читать.
 

Artik

Новичок
Невидел что б в telnet можно было фреймы делать :)
Мне нада имеенно под telnet :)

А код не такой уже и большой просто отступы сильные - тебя напугали :)
 

asm

Пофигист
Artik
помоему ты не совсем понимаешь что делаешь

-~{}~ 17.04.06 18:37:

вернее совсем не понимаешь
 

Acabar

Новичок
Ты даже не понял что там ирония была в моём сообщении, на эту тему тебе врятли кто нибудь поможет.
 

Artik

Новичок
То что убирать того кто отключился это еще ладно, например сделать когда $read === false то вырубать его...
Но главный вопрос что за глюк что отправляеться только с последнего открытого окна в сокеты, но принимаеться во все которым пишешь с последнего но кроме последнего некаким нельзя написать.
Ох я и написал...

-~{}~ 17.04.06 19:46:

Acabar
это форум. Почему ты думаешь что мне некто не поможет?
Я на другом форуме был, там вначале очень часто сам писал - мне помогали, потом когда свой уровень поднял то и другим помагал...
А сейчас я уже вырос с того форума - там сокеты в глаза некто не видел...

-~{}~ 17.04.06 19:50:

Хотя если чесно я не telnet использую а на флеше клиент написаный мною...
Но и там и там одинаковый глюк...

-~{}~ 17.04.06 20:09:

Тут же видно не большая ошибка неужели тяжело помочь?
Понятное дело если б вообще не работало...
 

kruglov

Новичок
$read = socket_read($msgsock, 1024); - вы сообщения только от последнего клиента и получаете.

Пишете циклом по всем, а читаете не циклом.
 

Artik

Новичок
уыкнывкеицуукееиыуие5
точно как я мог такое упустить! сенки и респект!!!

-~{}~ 17.04.06 22:57:

Чето я совсем туплю :(
Поставил вот так, и работает как раньше с глюком без изминений, хотя должно менять... :(
Уже замахался за сегодня...
Напишите как правильно :)
Вот код...:
PHP:
<?
///////////////////////
$ip 	= '10.0.0.60';
$port 	= 9876;
///////////////////////

set_time_limit(0);

error_reporting (E_ALL);

for ($i=0;$i<50;$i++){
echo "<!-- -->";
}
flush();

echo "Go...<br>";
flush();

$listen = socket_create (AF_INET, SOCK_STREAM, 0);
socket_set_option($listen, SOL_SOCKET, SO_REUSEADDR, 1);
//socket_set_nonblock($listen);
$ret = socket_bind ($listen, $ip, $port);
$ret = socket_listen ($listen, 5);


$clients = Array();

while (1==1)
{

$set = array_merge($listen, $clients);
	if (socket_select($set, $set_w = NULL, $set_e = NULL, 1, 0) > 0)
	{
		foreach ($set as $sock)
		{
			if ($sock == $listen)
			{
				if (($msgsock = socket_accept($listen)) < 0)
				{
				}
				else
				{
				$clients[$msgsock] = $msgsock;
				socket_getpeername($msgsock, $addr);
					foreach ($clients as $tsock)
					{
					$txt = "$addr conected...";
					socket_write($tsock, $txt);
					}
				echo $txt . "<br>";
				flush();
				}
			}
	if (($read = socket_read($msgsock, 1024)) === false || $read == '')
	{
		if ($read != '')
		{
		}
		else
		{
		$txt = "logout...";
			foreach ($clients as $tsock)
			{
			socket_write($tsock, $txt);
			}
		echo $txt . "<br>";
		flush();
		unset($clients[$msgsock]);
		}
	}
	else
	{
		$txt = "$addr $read";
			foreach ($clients as $tsock)
			{
			socket_write($tsock, $txt);
			}
		echo $txt . "<br>";
		flush();
	}
		}


	}

}
?>
 

kruglov

Новичок
Ну и что опять if (($read = socket_read($msgsock, 1024)) === false || $read == '') не в цикле по всем клиентам?

Я сейчас тоже туплю, ошибки указывать могу, а правильный ответ - извиняйте.
 

Artik

Новичок
PHP:
<? 
/////////////////////// 
$ip     = '10.0.0.60'; 
$port     = 9876; 
/////////////////////// 

set_time_limit(20); 

error_reporting (E_ALL); 

for ($i=0;$i<50;$i++){ 
echo "<!-- -->"; 
} 
flush(); 

echo "Go...<br>"; 
flush(); 

$listen = socket_create (AF_INET, SOCK_STREAM, 0); 
socket_set_option($listen, SOL_SOCKET, SO_REUSEADDR, 1); 
$ret = socket_bind ($listen, $ip, $port); 
$ret = socket_listen ($listen, 5); 


$clients = Array(); 

while (1==1) 
{ 
$set = array_merge($listen, $clients); 
    if (socket_select($set, $set_w = NULL, $set_e = NULL, 1, 0) > 0) 
    { 
        foreach ($set as $sock) 
        { 
            if ($sock == $listen) 
            { 
                if (($msgsock = socket_accept($listen)) < 0) 
                { 
                } 
                else 
                { 
                $clients[$msgsock] = $msgsock; 
                socket_getpeername($msgsock, $addr); 
                    foreach ($clients as $tsock) 
                    { 
                    $txt = "$addr conected...\n"; 
                    socket_write($tsock, $txt); 
                    } 
                echo $txt . "<br>"; 
                flush(); 
                } 
            } 
	$read = socket_read($sock, 1024); 
	if ($read!="")
	{
        $txt = "$addr $read\n"; 
            foreach ($clients as $tsock) 
            { 
            socket_write($tsock, $txt); 
            } 
        echo $txt . "<br>"; 
        flush(); 
	}
        } 
    } 
         

} 
?>
Вот так уже работает нормально, НО вначале когда кто то подсоединяеться и что то отправляет то первый раз пишет ошибку
Warning: socket_read() unable to read from socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in z:\home\non-existent-host\deamon\d.php on line 52
не понятно почему.
В чем проблема?
 
Сверху