Я пишу серверное приложение (вещатель) и клиент (ретранслятор). Несколько ретрансляторов могут одновременно подключиться к вещателю, отправить информацию, и вещатель перенаправит сообщение соответствующему ретранслятору (например, relayyer1 отправляет вещателю, который отправляет relayyer43, relayyer2 -> broadcaster -> relayyer73 ...)
Серверная часть работает так, как я тестировал ее с помощью клиента telnet, и хотя на данный момент она работает только на эхо-сервере.
И ретранслятор, и вещатель находятся на одном сервере, поэтому я использую сокеты AF_UNIX, хотя оба файла находятся в разных папках.
Я испробовал два подхода к ретранслятору, и оба потерпели неудачу, первый использует socket_create:
public function __construct()
{
// where is the socket server?
$this->_sHost = 'tcp://127.0.0.1';
$this->_iPort = 11225;
// open a client connection
$this->_hSocket = socket_create(AF_UNIX, SOCK_STREAM, 0);
echo 'Attempting to connect to '.$this->_sHost.' on port '.$this->_iPort .'...';
$result = socket_connect($this->_hSocket, $this->_sHost, $this->_iPort);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($this->_hSocket)) . "\n";
} else {
echo "OK.\n";
}
Возвращает «Предупреждение: socket_connect (): невозможно подключиться [2]: нет такого файла или каталога в relayyer.class.php в строке 27» и (запускается из командной строки) часто также возвращает ошибку сегментации.
Второй подход использует pfsockopen:
public function __construct()
{
// where is the socket server?
$this->_sHost = 'tcp://127.0.0.1';
$this->_iPort = 11225;
// open a client connection
$fp = pfsockopen ($this->_sHost, $this->_iPort, $errno, $errstr);
if (!$fp)
{
$result = "Error: could not open socket connection";
}
else
{
// get the welcome message
fgets ($fp, 1024);
// write the user string to the socket
fputs ($fp, 'Message ' . __LINE__);
// get the result
$result .= fgets ($fp, 1024);
// close the connection
fputs ($fp, "END");
fclose ($fp);
// trim the result and remove the starting ?
$result = trim($result);
$result = substr($result, 2);
// now print it to the browser
}
, который возвращает только ошибку «Предупреждение: pfsockopen (): невозможно подключиться к tcp: //127.0.0.1: 11225 (соединение отказано) в файле relayyer.class.php в строке 33»
Во всех тестах, которые я пробовал с разными именами хостов, 127.0.0.1, localhost, tcp: //127.0.0.1, 192.168.0.199, tcp: //192.168.0.199, ни один из них не работал.
Есть идеи по этому поводу?