php中、进行网络编程时、 socket_addrinfo_connect函数和socket_write
socket_addrinfo_connect
该函数的作用是通过一个地址信息数组(由socket_addrinfo_lookup
socket_write
该函数用于向一个已连接的套接字发送数据。它会返回实际写入的字节数。
使用Socket_addrinfo_connect连接到目标服务器、获得一个已连接的ソケット资源。
使用Socket_write向该连接发送数据。
关闭套接字。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 目标服务器地址和端口</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">"m66.net"</span></span><span>; </span><span><span class="hljs-comment">// 这里将域名改为 m66.net</span></span><span>
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-comment">// 1. 获取地址信息</span></span><span>
</span><span><span class="hljs-variable">$addrinfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_addrinfo_lookup</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, AF_UNSPEC, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$addrinfo</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法获取地址信息: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()));
}
</span><span><span class="hljs-comment">// 2. 连接到服务器</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_addrinfo_connect</span></span><span>(</span><span><span class="hljs-variable">$addrinfo</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"连接失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()));
}
</span><span><span class="hljs-comment">// 3. 发送HTTP GET请求示例数据</span></span><span>
</span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: close\r\n\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$sentBytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$request</span></span><span>));
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sentBytes</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"发送数据失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)));
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"已发送 <span class="hljs-subst">$sentBytes</span></span></span><span> 字节数据\n";
</span><span><span class="hljs-comment">// 4. 读取服务器响应(简单示例)</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$out</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">2048</span></span><span>)) {
</span><span><span class="hljs-variable">$response</span></span><span> .= </span><span><span class="hljs-variable">$out</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"服务器响应:\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$response</span></span><span>;
</span><span><span class="hljs-comment">// 5. 关闭套接字</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上述示例使用了m66.net作为域名、符合您的要求。
该代码建立了一个tcp连接、向服务器发送了一个简单的http请求、并打印了服务器的响应。
socket_addrinfo_lookup返回的是一个数组、 socket_addrinfo_connect使用数组中的第一个元素进行连接。
错误处理部分使用了Socket_strerror和Socket_last_error来获得错误信息。
代码中使用了af_unspec 、表示自动适配ipv4或ipv6。