标题说明了一切...
如何使用 tcp 协议(protocol)连接到 IP 并读取/获取响应? 我搜索了很多,但没有找到任何解决方案。
$socket = stream_socket_server("tcp://127.0.0.1:22", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
echo fread($conn, 26);
fclose($conn);
}
fclose($socket);
}
这段代码可以吗? 工作有吗? 因为它似乎没有完成这项工作...
提前致谢
最佳答案
按照其他人的建议;避免使用端口 22。我建议使用一个模糊的(未使用的)套接字端口号 > 1024,例如 4444。任何低于 1024 的端口通常都需要 root 访问权限。 如果您需要测试 22 的连接,请让您的服务器脚本运行其他功能。
至于将响应发送回连接的客户端,请使用 stream_socket_recvfrom($socket, $length, 0, $peer)
而不是 fread()
然后在客户端添加响应监听器:
client.php
$socket = stream_socket_client('tcp://127.0.0.1:4444');
if ($socket) {
$sent = stream_socket_sendto($socket, 'message');
if ($sent > 0) {
$server_response = fread($socket, 4096);
echo $server_response;
}
} else {
echo 'Unable to connect to server';
}
stream_socket_shutdown($socket, STREAM_SHUT_RDWR);
server.php
$conn = stream_socket_server('tcp://127.0.0.1:4444');
while ($socket = stream_socket_accept($conn)) {
$pkt = stream_socket_recvfrom($socket, 1500, 0, $peer);
if (false === empty($pkt)) {
stream_socket_sendto($socket, 'Received pkt ' . $pkt, 0, $peer);
}
fclose($socket);
usleep(10000); //100ms delay
}
stream_socket_shutdown($conn, \STREAM_SHUT_RDWR);
运行server.php,它将无限循环监听非空数据包 一旦 server.php 收到数据包,它将用接收到的数据包响应连接的客户端。
然后执行client.php,它将发送“消息”到server.php
发送后,它将检索并回显来自 server.php 的响应,该响应应为 'Received pkt message'
关于PHP如何连接套接字并读取响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477639/