当前位置: 首页> 最新文章列表> PHP 中 socket_accept() 与 socket_create() 如何配合使用?详解这两个函数的基本应用与配合方式

PHP 中 socket_accept() 与 socket_create() 如何配合使用?详解这两个函数的基本应用与配合方式

M66 2025-05-18

在 PHP 网络编程中,socket_create()socket_accept() 是两个非常重要的函数,尤其是在构建基于 TCP 或 UDP 的服务器端应用时。本文将详细介绍这两个函数的基本作用、用法,并展示它们如何配合使用,实现一个简单的服务器端程序。

一、socket_create() 的作用与使用

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_accept() 用于服务器端监听的 socket 上接受客户端连接。它的函数原型是:

resource socket_accept ( resource $socket )
  • 参数 $socket 是之前用 socket_create() 创建并且监听的 socket。

  • 调用后,如果有客户端连接请求,返回一个新的 socket 资源,用于与该客户端通信;如果失败,返回 false

三、socket_create() 与 socket_accept() 的配合

要让服务器能够监听客户端请求并接收连接,通常流程如下:

  1. 创建 socket
    使用 socket_create() 创建一个 socket。

  2. 绑定地址和端口
    使用 socket_bind() 将 socket 绑定到本地 IP 和端口。

  3. 监听 socket
    使用 socket_listen() 监听端口,准备接受连接。

  4. 接受连接
    使用 socket_accept() 阻塞等待客户端连接,成功后返回新的 socket。

  5. 读写数据
    通过新 socket 与客户端通信。

  6. 关闭连接
    通信完成后关闭 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 的网络服务。