PHP 中的 Socket 函数

Socket 就是一种通信机制,类似于银行、电信这些部门的电话客服部门。打电话时,对方会分配一个坐席代表回答你的问题,客服部门就相当于 Socket 的服务器端,你就相当于客户端。在通话结束前,如果有人想找到和你通话的坐席代表是不可能的,因为你们正在通信,客服部门的电话交换机也不会重复分配。

Socket 函数的原型定义如下:

SOCKET socket( int af, int type, int protocol);

Socket 函数的原型定义如下:

af:指定应用程序使用的通信协议的协议族,对于 TCP/IP 协议族该参数置 AF_INET,对于 NUIX 可建立本地 Socket 。

type:指定创建的 Socket 类型。有三种可选项。

流套接字类型(SOCK_STREAM):最常见类型,基于 TCP 协议。

数据报套接字类型(SOCK_DGRAM):即 UDP 数据报。

原始套接字类型(SOCK_RAW):在 IP 层对套接字进行编程,实际上就是在 IP 层够造自己的 IP 包,然后把这个 IP 包发送出去。

protocol:指定应用程序所使用的通信协议。最常用的是 TCP 协议与 UDP 协议。

同样,可以把从 TCP/UDP 传输层过来的包抓取过来并进行分析。流套接字和数据报套接字不能完成的任务,可以在原始套接字中得以实现。所有语言提供的 Socket API 都是按照这个原型设计的。

提示:Socket 从传输模式上又分为端对端和点对点的连接,流套接字和数据报套接字都属于端对端的连接,因此需要绑定端口号。而原始套接字是基于 IP 协议的,属于点对点的传输模式,是没有端口这个概念的。比如常用的监测网络连接 ping 命令,就是基于 ICMP 协议的,它不存在端口概念。

PHP 创建 Socket

<?php
$host = '192.168.2.14';
$port = 11109;
set_time_limit(0); //最好在 CLI 模式下运行,保证服务不会超时
//创建 Socket
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die("Could not create socket\n");
//绑定 Socket 到指定地址和端口
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
//开始监听连接
$result = socket_listen($socket,3) or die("Could not set up socket listener\n");
//接收连接请求并调用另一个子 Socket 处理客户端——服务器间的信息
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
//读取客户端输入
$input = socket_read($spawn,1024) or die("Could not read input\n");
//clean up input string
$input = trim($input);
//反转客户端输入数据,返回服务端
$output = strrev($input)."\n";
socket_write($spawn,$output,strlen($output)) or die("Could not write output\n");
//关闭 sockets
socket_close($spawn);
socket_close($socket);
?>

PHP 的语言特性和自身定位决定了它只适合做客户端,而不适合做服务器端。因为 Socket  主要面向底层和网络服务开发,一般服务器端都是用 C、Java 等语言实现,这样能更好地操纵底层,对网络服务开发中遇到的问题(如并发、阻塞等)也有完善、成熟的解决方案,而 PHP 显然不适合这种应用场景。

实际上,PHP 操作 MySQL 数据库也是通过 Socket  进行的,这正是由于 Socket  屏蔽了底层的协议,使得网络服务之间的互联互通变得简单。

猜你喜欢

转载自wangzq-phper.iteye.com/blog/2363752