Php套接字与流

时间:2012-03-18 17:35:17

标签: php sockets stream

我认为php套接字和php流相互重叠 我已经设法使用套接字或流来创建CLI PHP聊天客户端和服务器。

这里有一些说明代码行:
使用套接字:

...
$main_socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Cannot create socket.\n");
@socket_bind($main_socket, $host, $port) or die("Could not bind to socket $host : $port.\n");
@socket_listen($main_socket, 5) or die("Could not set up socket listener\n");
...

使用流:

...
$main_socket = @stream_socket_server ("tcp://$host:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN) or die("Cannot create socket.\n");
$clients = array($main_socket);
$clients_peername = array(array('port' => $port));

fputs(STDOUT, "Waiting for connections...\n");
...

这里的要点是可以制作客户端和服务器 使用套接字函数,或者使用流函数。

我知道Streams是PHP核心的一部分,而套接字是扩展。

我的问题是(是):

  • 引用套接字编程时套接字和流有什么区别?
  • 是否有任何与套接字编程相关的功能,而另一个功能可以不具备?

2 个答案:

答案 0 :(得分:11)

根据手册,套接字扩展更低级。例如,在创建一个套接字时,你可以选择SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET等。

  

套接字扩展实现了基于流行的BSD套接字的套接字通信功能的低级接口,可以充当套接字服务器和客户端。

     

有关更通用的客户端套接字接口,请参阅stream_socket_client(),stream_socket_server(),fsockopen()和pfsockopen()。

来源:http://www.php.net/manual/en/intro.sockets.php

答案 1 :(得分:6)

正如您所指出的,'streams'是PHP核心(内置,始终可用),而'socket'是很少包含的扩展的一部分。除此之外,它们几乎相同。您可以同时使用TCP和UDP以及阻塞和非阻塞模式的流,这些模式覆盖了所有用例的99%。

我能想到的唯一常见例外是ICMP。例如,'ping'。但是,看起来目前还没有一种安全的方法可以从PHP进行ICMP。此类调用需要SOCK_RAW通过套接字扩展,这需要“root”权限才能执行。此外,并非所有路由器都将路由TCP,UDP和ICMP之外的其他数据包类型。这限制了套接字扩展的有用性。