2012-03-18 39 views
18

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

这里一些表示行代码:
使用套接字:

... 
$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核心的一部分,而套接字是扩展。

我的问题(s)为(是):

  • 指socket编程的时候是什么插座之间的区别和溪流?
  • 有没有什么能力,与套接字编程有关,一个人可以有另一个不能?
+0

@JamWaffles感谢您的编辑和对我的英语感到抱歉。 – 2012-03-18 21:57:00

+0

没问题。你的英语几乎是完美的,所以没有什么可担心的:) – Bojangles 2012-03-18 22:09:39

回答

9

根据手册,套接字扩展是更低层次的。例如,蒙山插座你有更细粒度的控制创建一个时,并可以选择SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET等

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

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

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

+1

*更低级*意味着更快吗? – Pacerier 2013-07-14 20:18:41

+0

不一定,它只是意味着你对发生的事情有更多的控制权。不过,在某些情况下,您可能会使用更精细的控件来提高速度。 – serans 2013-08-05 15:36:01

4

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

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