在PHP中,进行网络编程时,socket_addrinfo_connect 函数和 socket_write 函数是两个非常有用的工具。socket_addrinfo_connect 用于通过地址信息结构体(addrinfo)来连接到目标服务器,而 socket_write 则用于向已连接的套接字写入数据。本文将介绍如何结合这两个函数实现数据发送,并给出一个简单的示例代码。
socket_addrinfo_connect
该函数的作用是通过一个地址信息数组(由 socket_addrinfo_lookup 返回)连接到远程服务器。它的优势是能够支持 IPv4 和 IPv6,并且支持多种协议。
socket_write
该函数用于向一个已连接的套接字发送数据。它会返回实际写入的字节数。
使用 socket_addrinfo_lookup 获取目标主机的地址信息(addrinfo结构体数组)。
使用 socket_addrinfo_connect 连接到目标服务器,获得一个已连接的 socket 资源。
使用 socket_write 向该连接发送数据。
关闭套接字。
<?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_strerror 和 socket_last_error 来获得错误信息。
代码中使用了 AF_UNSPEC,表示自动适配IPv4或IPv6。