Php 套接字与流

2022-08-30 16:11:31

我认为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核心的一部分,Sockets是一个扩展。

我的问题是(是):

  • 在提到套接字编程时,套接字和流之间有什么区别?
  • 是否有任何与套接字编程相关的功能,一个人可以拥有,而另一个则不能?

答案 1

根据手册,插座扩展更低级。例如,在创建套接字时,您可以对套接字进行更细粒度的控制,并且可以选择SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET等。

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

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

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


答案 2

正如你所指出的,“流”在PHP核心(内置,始终可用)中,而“套接字”是很少包含的扩展的一部分。除此之外,它们几乎完全相同。您可以将 TCP 和 UDP 与具有两种模式以及阻塞和非阻塞模式的流一起使用,这涵盖了所有用例的 99%。

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


推荐