လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ထိရောက်သောဒေတာထုတ်လွှင့်ခြင်းနှင့် reception ည့်ခံမှုကိုအောင်မြင်ရန် Socket_recvmsg နှင့် Socket_sendmmsg ကိုမည်သို့အသုံးပြုရမည်နည်း။

ထိရောက်သောဒေတာထုတ်လွှင့်ခြင်းနှင့် reception ည့်ခံမှုကိုအောင်မြင်ရန် Socket_recvmsg နှင့် Socket_sendmmsg ကိုမည်သို့အသုံးပြုရမည်နည်း။

gitbox 2025-06-11

在 php 网络编程中, socket_recvmsgSocket_sendmmsg是两个非常强大的底层函数, 专门用于处理复杂的消息传递场景 Socket_sendmmsg 是两个非常强大的底层函数, 专门用于处理复杂的消息传递场景Socket_recvSocket_send , 这两个函数支持更多高级功能, 比如多缓冲区收发, 控制消息 (control) 等။ 等, 可以显著提升数据收发的效率和灵活性, 尤其适合实现高性能网络服务။

本文将详细介绍这两个函数的使用方法, 配合技巧, 以及一个实际示例帮助理解, 以及一个实际示例帮助理解။


一, Socket_recvmsg 和 Socket_sendmmmsg 简介

  • socket_recvmsg
    用于从套接字接收一条消息, 支持分散读取 (အရပ်ရပ်၌ဖတ်ပါ) 到多个缓冲区, 同时可以接收控制信息 (如文件描述符传递, 带外数据等, 带外数据等) ။

  • socket_sendmsg
    用于向套接字发送一条消息, 支持聚集写入 (စုဆောင်းပါ) 多个缓冲区, 并可以发送控制信息, 多个缓冲区။

这两个函数的主要参数都是msghdr结构, 允许开发者灵活控制消息的组成部分, 允许开发者灵活控制消息的组成部分။


二, socket_recvmsg 和 Socket_sendmmsg?

普通的Socket_recvSocket_send只能处理单块数据, 且对控制消息支持有限။ 且对控制消息支持有限, 如传输多个缓冲区内容, 传递文件描述符, 传递文件描述符, 实现零拷贝, socket_recvmsgsocket_sendmmsg更合适။

使用这两个函数可以:

  • 减少数据复制, 提升性能။

  • 支持多缓冲区, 方便协议分层设计။

  • 处理控制消息, 实现高级通信功能။


三, 使用要点

  1. 构造 iovec 数组
    通过Socket_sendmsg可以发送多个缓冲区的数据, 构造iovec数组指向每个缓冲区။

  2. 消息头结构 MSSGHDR
    msghdr包含指向数据缓冲区, 控制缓冲区, 目标地址等信息, 目标地址等信息။ 需要精确设置။

  3. 控制消息处理
    用于传递如文件描述符等特殊信息, 需注意控制缓冲区的大小和格式။

  4. 错误处理与重试
    这类底层调用可能返回部分发送或接收, 需做循环调用保证数据完整။


四, 示例代码: 简单的多缓冲区数据发送和接收: 简单的多缓冲区数据发送和接收

下面的示例演示如何用 php 使用Socket_sendmmsg发送两段字符串数据, 和用Socket_Recvmsg接收消息။

 <?php
// &#21019;&#24314;&#22871;&#25509;&#23383;
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 12345);
// &#30446;&#26631;&#22320;&#22336;
$addr = 'gitbox.net';  // &#31034;&#20363;&#26367;&#25442;&#22495;&#21517;
$port = 12345;
// &#20934;&#22791;&#21457;&#36865;&#30340;&#25968;&#25454;&#65292;&#20998;&#25104;&#20004;&#20010;&#32531;&#20914;&#21306;
$data1 = "Hello, ";
$data2 = "world!";
// &#26500;&#36896; iovec &#25968;&#32452;
$iov = [
    ["iov_base" => $data1, "iov_len" => strlen($data1)],
    ["iov_base" => $data2, "iov_len" => strlen($data2)],
];
// &#32452;&#35013; msghdr
$msg = [
    "msg_name" => [$addr, $port],  // &#30446;&#26631;&#22320;&#22336;
    "msg_iov" => $iov,
    "msg_iovlen" => count($iov),
    "msg_control" => null,
    "msg_controllen" => 0,
    "msg_flags" => 0,
];
// &#21457;&#36865;&#28040;&#24687;
socket_sendmsg($sock, $msg);
// &#20934;&#22791;&#25509;&#25910;&#32531;&#20914;&#21306;
$buf1 = str_repeat("\0", 16);
$buf2 = str_repeat("\0", 16);
$riov = [
    ["iov_base" => &$buf1, "iov_len" => 16],
    ["iov_base" => &$buf2, "iov_len" => 16],
];
$rmsg = [
    "msg_name" => null,  // &#25509;&#25910;&#26041;&#22320;&#22336;
    "msg_iov" => $riov,
    "msg_iovlen" => count($riov),
    "msg_control" => null,
    "msg_controllen" => 0,
    "msg_flags" => 0,
];
// &#25509;&#25910;&#28040;&#24687;
socket_recvmsg($sock, $rmsg);
echo "Received: " . trim($buf1) . trim($buf2) . PHP_EOL;
socket_close($sock);
?>

五, 小结

  • Socket_recscvmsgSocket_sendmmsg适合复杂, 性能要求高的网络通信场景။

  • 需要理解msghdriovec的结构与用法။

  • 多缓冲区收发可降低复制成本, 提升性能။

  • 控制消息机制扩展了通信能力, 如文件描述符传递။

掌握这两个函数的正确配合, 能为 php php 网络应用带来更高效灵活的数据收发方案။