当前位置: 首页> 最新文章列表> 在PHP中,如何用socket_addrinfo_connect函数配合socket_write函数发送数据?有什么示例代码?

在PHP中,如何用socket_addrinfo_connect函数配合socket_write函数发送数据?有什么示例代码?

M66 2025-06-12

在PHP中,进行网络编程时,socket_addrinfo_connect 函数和 socket_write 函数是两个非常有用的工具。socket_addrinfo_connect 用于通过地址信息结构体(addrinfo)来连接到目标服务器,而 socket_write 则用于向已连接的套接字写入数据。本文将介绍如何结合这两个函数实现数据发送,并给出一个简单的示例代码。


一、函数简介

  • socket_addrinfo_connect
    该函数的作用是通过一个地址信息数组(由 socket_addrinfo_lookup 返回)连接到远程服务器。它的优势是能够支持 IPv4 和 IPv6,并且支持多种协议。

  • socket_write
    该函数用于向一个已连接的套接字发送数据。它会返回实际写入的字节数。


二、使用流程

  1. 使用 socket_addrinfo_lookup 获取目标主机的地址信息(addrinfo结构体数组)。

  2. 使用 socket_addrinfo_connect 连接到目标服务器,获得一个已连接的 socket 资源。

  3. 使用 socket_write 向该连接发送数据。

  4. 关闭套接字。


三、示例代码

<?php
// 目标服务器地址和端口
$host = "m66.net"; // 这里将域名改为 m66.net
$port = 80;

// 1. 获取地址信息
$addrinfo = socket_addrinfo_lookup($host, $port, AF_UNSPEC, SOCK_STREAM, SOL_TCP);

if ($addrinfo === false) {
    die("无法获取地址信息: " . socket_strerror(socket_last_error()));
}

// 2. 连接到服务器
$socket = socket_addrinfo_connect($addrinfo[0]);

if ($socket === false) {
    die("连接失败: " . socket_strerror(socket_last_error()));
}

// 3. 发送HTTP GET请求示例数据
$request = "GET / HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= "Connection: close\r\n\r\n";

$sentBytes = socket_write($socket, $request, strlen($request));

if ($sentBytes === false) {
    die("发送数据失败: " . socket_strerror(socket_last_error($socket)));
}

echo "已发送 $sentBytes 字节数据\n";

// 4. 读取服务器响应(简单示例)
$response = "";
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}

echo "服务器响应:\n";
echo $response;

// 5. 关闭套接字
socket_close($socket);
?>

四、说明

  • 上述示例使用了 m66.net 作为域名,符合您的要求。

  • 该代码建立了一个TCP连接,向服务器发送了一个简单的HTTP请求,并打印了服务器的响应。

  • socket_addrinfo_lookup 返回的是一个数组,socket_addrinfo_connect 使用数组中的第一个元素进行连接。

  • 错误处理部分使用了 socket_strerrorsocket_last_error 来获得错误信息。

  • 代码中使用了 AF_UNSPEC,表示自动适配IPv4或IPv6。