Ситуация следующая: 1)на сервере: - открыл 8888 порт через брендмауэр вручную - Выключил брендмауэр - слушаю эту связку 0.0.0.0:8888 2)на клиенте -Отключил брендмауэр вручную -делаю коннект к ip_сервера:8888 3)В результате: a) на сервере: read-сокет который выдала фукция stream_select() оказывается c пустым буфером после коннекта клиента. б)На клиенте: отваливание сокета после 30 секундного таймаута при коннекте Вопрос: Кто или что может блокировать коннект подобным образом? Кто нибудь встречал подобную блокировку?
mamontenok Уточните, как именно вы принимаете соединения на сервере. Что происходит между вызовами функции *_bind и stream_select
Код сервера: PHP: echo "<br>Будем ожидать соединения на ".$_POST['ip'].":".$_POST['port']; $master = array(); $socket = stream_socket_server("tcp://".$_POST['ip'].":".$_POST['port'], $errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { $master[] = $socket; $read = $master; while (1) { $read = $master; $mod_fd = stream_select($read, $_w = NULL, $_e = NULL, 5); if ($mod_fd === FALSE) { break; } for ($i = 0; $i < $mod_fd; ++$i) { if ($read[$i] === $socket) { $conn = stream_socket_accept($socket); fwrite($conn, "Hello! The time is ".date("n/j/Y g:i a")."\n"); $master[] = $conn; } else { $sock_data = fread($read[$i], 1024); var_dump($sock_data); if (strlen($sock_data) === 0) { // connection closed $key_to_del = array_search($read[$i], $master, TRUE); fclose($read[$i]); unset($master[$key_to_del]); } else { if ($sock_data === FALSE) { echo "Something bad happened"; $key_to_del = array_search($read[$i], $master, TRUE); unset($master[$key_to_del]); } else { echo "The client has sent :"; var_dump($sock_data); fwrite($read[$i], "You have sent :[".$sock_data."]\n"); fclose($read[$i]); unset($master[array_search($read[$i], $master)]); } } }//else }//for }//while }//else ?> Код клиента: PHP: <form action="?next=1" method="POST"> <input type="text" name="ip">ip адрес для коннекта<br> <input type="text" name="port">port для коннекта<br> <input type="submit" value="Подключиться"> </form> <?php if($_GET['next']==1) { echo "<br>коннектимся к".$_POST['ip'].":".$_POST['port']; $fp = stream_socket_client("tcp://".$_POST['ip'].":".$_POST['port'], $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { fwrite($fp, "Aloha"); while (!feof($fp)) { var_dump(fgets($fp, 1024)); } fclose($fp); } } ?>
Еще добавлю. На одной машине при коннекте на ее внешний ip адрес с нее же , все отлично работает., буфер у сервера оказывается наполненным заголовками если коннект делать через браузер. Если же коннектится с удаленной машины используя тот же самый клиент, то происходит зависалово и после 30 секунд у клиента отваливается сокет по 30 секундному таймауту, а у сервера streaam_select() возвращает всетаки read сокет, но после чтения из него, оказывается что буфер пуст! Ну не чудеса?