Как отправить дейтаграммы через сокет unix из PHP? - PullRequest
2 голосов
/ 20 декабря 2010

Я делаю:

$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
if (@socket_connect($socket, $path) === false) { ... }

Но я получаю эту ошибку:

(91): Protocol wrong type for socket

Я использую какой-либо из параметров неправильно? Я подозреваю из второго параметра socket_create. Я не смог найти никакой помощи в документации: http://php.net/manual/es/function.socket-create.php

Ответы [ 4 ]

4 голосов
/ 22 ноября 2012

Это сильно устарело, но я обнаружил, что так оно и работает:

$sock = stream_socket_client('unix:///tmp/test.sock', $errno, $errst);
fwrite($sock, 'message');
$resp = fread($sock, 4096);
fclose($sock);
1 голос
/ 14 апреля 2017

Для сокетов Unix нам не нужно использовать socket_connect.

Вот очень простой рабочий пример с отправителем и получателем:

sender.php

<?php
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
socket_sendto($socket, "Hello World!", 12, 0, "/tmp/myserver.sock", 0);
echo "sent\n";
?>

receiver.php

<?php

$file = "/tmp/myserver.sock";
unlink($file);

$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);

if (socket_bind($socket, $file) === false) {
  echo "bind failed";
}

if (socket_recvfrom($socket, $buf, 64 * 1024, 0, $source) === false) {
  echo "recv_from failed";
}

echo "received: " . $buf . "\n";

?>

Обратите внимание, что только получателю необходимо привязаться к адресу (файлу сокета unix), а затем использовать socket_recvfrom. Отправитель просто звонит socket_sendto.

0 голосов
/ 30 сентября 2014

Третий аргумент для socket_create неверен, следовательно, сообщение об ошибке.

Это должно быть socket_create (AF_INET, SOCK_DGRAM, SOL_UDP);

Указанное вами значение 0 соответствует SOL_IP, который не поддерживается в php.

0 голосов
/ 20 декабря 2010

Вы пытались использовать getprotobyname() для третьего (протокольного) параметра?

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