Ошибки сокетов PHP (соединение отказано и нет такого файла или каталога) - PullRequest
2 голосов
/ 06 мая 2010

Я пишу серверное приложение (вещатель) и клиент (ретранслятор). Несколько ретрансляторов могут одновременно подключиться к вещателю, отправить информацию, и вещатель перенаправит сообщение соответствующему ретранслятору (например, 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, ни один из них не работал.

Есть идеи по этому поводу?

1 Ответ

2 голосов
/ 06 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...