如何从PHP通过Unix套接字发送数据报?

4

我正在进行:

$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个回答

7
也许这种方法已经过时了,但我发现这样做可以正常工作:
$sock = stream_socket_client('unix:///tmp/test.sock', $errno, $errst);
fwrite($sock, 'message');
$resp = fread($sock, 4096);
fclose($sock);

4
对于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


请查看此另一个答案,其中包含PHP和C的工作示例。 - Bernardo Ramos

0
你尝试过在第三个参数(协议)中使用getprotobyname()吗?

你想使用的协议名称,我猜测应该在英文文档页面的评论中有它们的列表:http://nl3.php.net/manual/en/function.getprotobyname.php - Spiny Norman
我尝试了我想要的"udp"协议,但是出现错误[93]: 协议不受支持。 - Juanjo Conti
嗯。php.ini里面包含了所有的东西吗?我在某个地方读到udp不能与ipv6一起使用,但那可能不是问题所在。无论如何,在这里还有更多的例子:http://php.net/manual/en/function.socket-create.php。 - Spiny Norman

-1

socket_create的第三个参数不正确,因此出现了错误消息。

应该是socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

您指定的值0对应于SOL_IP,这不是php支持的协议。


不,原因是因为在 SOCK_DGRAM 套接字上不应该使用 socket_connect。而你的 AF_INET 与 Unix 域套接字的问题无关。 - Bernardo Ramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接