我认为php套接字和php流相互重叠
我已经使用套接字或流制作了一个CLIPHP聊天客户端和一个服务器。
以下是一些示例代码行:
使用插座:
...
$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 listenern");
...
使用流:
...
$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是一个扩展。
我的问题是:
- 当提到套接字编程时,套接字和流之间有什么区别
- 有没有与套接字编程相关的功能,一个可以拥有,而另一个不能
根据手册,套接字扩展更低级。例如,whith套接字在创建时具有更细粒度的控制,并且可以选择SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKET等。
套接字扩展实现了一个基于流行的BSD套接字的套接字通信功能的低级接口,提供了充当套接字服务器和客户端的可能性。
有关更通用的客户端套接字接口,请参阅stream_socket_client()、stream_sockt_server()、fsockopen()和pfsockopen()。
来源:http://www.php.net/manual/en/intro.sockets.php
正如您所指出的,"streams"在PHP核心中(内置,始终可用),而"sockets"是很少包含的扩展的一部分。除此之外,它们几乎完全相同。您可以将TCP和UDP与流同时使用,也可以使用阻塞和非阻塞模式,这涵盖了99%的所有用例。
我能想到的唯一常见的例外是ICMP。例如,"ping"。然而,目前似乎没有一种安全的方法从PHP执行ICMP。此类调用通过套接字扩展需要SOCK_RAW,而套接字扩展需要"root"权限才能执行。此外,并非所有路由器都会路由TCP、UDP和ICMP之外的其他数据包类型。这限制了套接字扩展的有用性。