如何通过PHP的unix套接字发送数据报?

时间:2010-12-20 13:15:59

标签: php sockets unix

我在做:

$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 个答案:

答案 0 :(得分:4)

这是maby过时了,但我发现这种方式可以正常运行:

$sock = stream_socket_client('unix:///tmp/test.sock', $errno, $errst);
fwrite($sock, 'message');
$resp = fread($sock, 4096);
fclose($sock);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您是否尝试将getprotobyname()用于第3个(协议)参数?

答案 3 :(得分:0)

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

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

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