Сокеты и поточность

leosun

Новичок
Сокеты и поточность

Господа - такая проблема при работе с сокетами данные принимаются ото всех подключний а отдается только тому пользователю который первым установил соединение, когда он отрубается следующему отдается информация...

PHP:
<?php
include("./db.php");
error_reporting (E_ALL);

/* Разрешить скрипту зависнуть в ожидании соединений. */
set_time_limit (0);

/* Включить неявную очистку вывода, и мы увидим всё получаемое
 * по мере поступления. */
ob_implicit_flush ();

$address = '17.412.43.118';
$port = 6779;

if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}

if (($ret = socket_bind ($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}

if (($ret = socket_listen ($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
        break;
    }
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));
    
    do {
        if (FALSE === ($buf = @socket_read ($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
            break 2;
        }
        if (!$buf = trim ($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close ($msgsock);
            break 2;
        }
		if (preg_match("#(login):(.*):(.*)#i",$buf,$matches)){
			$login = addslashes($matches[2]);
			$passwd = $matches[3];

			$sql = "SELECT uid FROM `users` WHERE `login` = '$login' AND `pw` = '".md5($passwd)."'";
			$result = mysql_query($sql);

			if (mysql_num_rows($result) > 0)
			{
				list($uid) = mysql_fetch_array($result);
			}
			else {
			$talkback = 'ERROR_AUTH';
			socket_write ($msgsock, $talkback, strlen ($talkback));
			}

			//$talkback = $sql;
        }
    } while (true);
    socket_close ($msgsock);
} while (true);

socket_close ($sock);
?>
 

Апокалипсис

тех дир matras.ru
Уважайте участников форума. Оформите топик в соответствии с правилами и с рекомендациями!
 

MiksIr

miksir@home:~$
leosun, ваш код работает правильно. Он написан так, что бы работать не более чем с одним соединением. Если хотите работать со многими соединениями, перепишите код. Примеров, как это делать, много везде - это основы работы с сокетами.
 

leosun

Новичок
Спасибо!!! Да-да уже нашел что решается через не блокирующие сокеты =)
 

cDLEON

Онанист РНРСlub
fixxxer
Зря ты ему дал non_blocking...Лучше бы просто селект...
 

cDLEON

Онанист РНРСlub
MiksIr
Не. Форка - наврядли...Сто пудова на винде, на каком нить денвере тестирование проводилось бы)
 

fixxxer

К.О.
Партнер клуба
нет уж, сами на форках делайте :) я такое советовать не буду :)
 

cDLEON

Онанист РНРСlub
phprus
Хм...Руками?

-~{}~ 14.11.07 14:15:

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

MiksIr

miksir@home:~$
fixxxer, у Вас проблемы с форками? Выбрасывайте свой виндовс. Начинать учить работу с сокетами на мультиплексирующем сервере, это жесть. Еще большая жесть предлагать мультиплектирование для того кода, что привел топикстартер - там классическая схема с форком, только сам форк почему-то забыт.

-~{}~ 14.11.07 14:28:

phprus, а в каком месте селекта требуются неблокирующиеся сокеты?
 

phprus

Moderator
Команда форума
Да. Я пожалуй ступил. Просто я всегда использовал сокет_селект с неблокирующими сокетами и по этому чтото вдруг подумал что с блокирующими сокет_селект не работает.
 

fixxxer

К.О.
Партнер клуба
выбрасывать мне нечего ;)

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

а форк в классическом виде разве что только для обучения и годится - попробовать, запустить на это дело ab, положить сервак и забыть про это дело =) а с префорком посложнее будет чем простой мультиплексинг то - и все равно менее эффективно в большинстве случаев.
 

MiksIr

miksir@home:~$
fixxxer ну соизмеряйте задачи и их решения. Тем более явно человек ни бум-бум в этой теме - не нужно ему это знание пока. Не нужно учить современные технологии не выучив базу.
И вообще, писать мультиплексор для 3,5 юзеров в час смешно. Да хоть и с 1 юзером в секунду форк прекрасно справляется. Писать мультиплексор для большого числа соединений на select - очень смешно, ибо ацкие накладные расходы на путешествие всех сетов сокетов между приложением и ядром. Селект хорош на малых количествах сокетов.
 

fixxxer

К.О.
Партнер клуба
проблема селекта в основном в дергании ядра на неактивные соединения;) поскольку такие штучки на пхп пишутся в основном как аппсервер во внутренней сети (я с трудом представляю себе такую хрень выставленную задницей в интернет) то медленных клиентов нет, а есть наоборот частые и быстрые запросы, и тут как раз все вполне эффективно, а в модели с форком как раз будет дофига накладных расходов. нет, я не спорю что тредстартеру хватит наверняка и модели с обычным форком, эт я уже так флейма ради =)
 

cDLEON

Онанист РНРСlub
Тот, пример что привёл топик стартер - это пример из мануала.
 

Alexandre

PHPПенсионер
а форк в классическом виде разве что только для обучения и годится - попробовать, запустить на это дело ab, положить сервак и забыть про это дело =) а с префорком посложнее будет чем простой мультиплексинг то - и все равно менее эффективно в большинстве случаев.
+1
fork на РНР - это жесть, хотя с другой стороны - форки под HTTP не работают.
 

MiksIr

miksir@home:~$
> fork на РНР - это жесть
Почему?

> форки под HTTP не работают
Имеется ввиду под mod_php? Ну наверно уж ни один вменяемый человек не будет писать сервер под mod_php.
 

Gas

может по одной?
Ну наверно уж ни один вменяемый человек не будет писать сервер под mod_php
порой кажется (и не только мне) что вменяемых php-developer'ов очень небольшой % среди общей массы :)
 
Сверху