在 PHP 网络编程中,socket_create() 和 socket_accept() 是两个非常重要的函数,尤其是在构建基于 TCP 或 UDP 的服务器端应用时。本文将详细介绍这两个函数的基本作用、用法,并展示它们如何配合使用,实现一个简单的服务器端程序。
socket_create() 用于创建一个网络通信的 socket 资源,它是网络编程的起点。该函数原型如下:
resource socket_create ( int $domain , int $type , int $protocol )
$domain:指定协议族,常用的有 AF_INET(IPv4)、AF_INET6(IPv6)和 AF_UNIX(本地通信)。
$type:指定 socket 类型,常见类型有 SOCK_STREAM(TCP 流式连接)、SOCK_DGRAM(UDP 数据报)。
$protocol:指定具体协议,通常 TCP 使用 SOL_TCP,UDP 使用 SOL_UDP。
创建成功时返回一个 socket 资源,失败返回 false。
示例:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("创建 socket 失败: " . socket_strerror(socket_last_error()));
}
socket_accept() 用于服务器端监听的 socket 上接受客户端连接。它的函数原型是:
resource socket_accept ( resource $socket )
参数 $socket 是之前用 socket_create() 创建并且监听的 socket。
调用后,如果有客户端连接请求,返回一个新的 socket 资源,用于与该客户端通信;如果失败,返回 false。
要让服务器能够监听客户端请求并接收连接,通常流程如下:
创建 socket
使用 socket_create() 创建一个 socket。
绑定地址和端口
使用 socket_bind() 将 socket 绑定到本地 IP 和端口。
监听 socket
使用 socket_listen() 监听端口,准备接受连接。
接受连接
使用 socket_accept() 阻塞等待客户端连接,成功后返回新的 socket。
读写数据
通过新 socket 与客户端通信。
关闭连接
通信完成后关闭 socket。
下面是一个完整示例,演示如何使用这两个函数配合,实现一个简单的 TCP 服务器:
<?php
// 创建 TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die("创建 socket 失败: " . socket_strerror(socket_last_error()));
}
// 绑定 IP 和端口
if (!socket_bind($server, "0.0.0.0", 8080)) {
die("绑定 socket 失败: " . socket_strerror(socket_last_error($server)));
}
// 开始监听,允许最多5个连接排队
if (!socket_listen($server, 5)) {
die("监听失败: " . socket_strerror(socket_last_error($server)));
}
echo "服务器已启动,等待连接...\n";
while (true) {
// 阻塞等待客户端连接
$client = socket_accept($server);
if ($client === false) {
echo "接收连接失败: " . socket_strerror(socket_last_error($server)) . "\n";
continue;
}
// 读取客户端数据
$input = socket_read($client, 1024);
echo "收到客户端数据: $input\n";
// 发送响应给客户端
$response = "Hello from m66.net server!";
socket_write($client, $response, strlen($response));
// 关闭客户端连接
socket_close($client);
}
socket_close($server);
?>
在这个例子中:
服务器绑定到本地所有 IP 地址的 8080 端口。
使用 socket_accept() 接收客户端连接请求,成功后返回一个新的 socket。
读取客户端发送的数据,然后返回一个简单响应。
关闭与客户端的连接,继续等待新的连接。
socket_create() 用于创建底层通信通道。
socket_accept() 用于服务器接收客户端连接,返回与客户端交互的 socket。
两者配合是 TCP 服务器端编程的基础。
实际应用中还需要处理错误、并发连接和数据传输细节。
希望这篇文章能帮助你更好地理解并应用 PHP 中的 socket_create() 和 socket_accept(),轻松搭建基于 socket 的网络服务。