【问题标题】:How to send datagrams through a unix socket from PHP?如何通过 PHP 的 unix 套接字发送数据报?
【发布时间】:2011-05-28 06:14:40
【问题描述】:

我在做:

$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

【问题讨论】:

    标签: php sockets unix


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    它可能已经过时了,但我发现这种方式可以正常工作:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 不,原因是它不应该在 SOCK_DGRAM 套接字上使用socket_connect。而您的AF_INET 与有关 unix 域套接字的问题无关
      【解决方案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 文件)然后使用socket_recvfrom。发件人只需拨打socket_sendto

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2013-06-04
      相关资源
      最近更新 更多