欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP 中的 Socket 函数

程序员文章站 2022-06-11 13:49:51
...

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  屏蔽了底层的协议,使得网络服务之间的互联互通变得简单。