2

标题说明了一切……

如何使用 tcp 协议连接到 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);
}

这段代码可以吗?工作吗?因为它似乎没有做这项工作......

提前致谢

4

2 回答 2

3

根据其他人的建议;避免使用端口 22。我建议使用不明显(未使用)的套接字端口号 > 1024,例如 4444。低于 1024 的任何内容通常都需要 root 访问权限。如果您需要测试 22 的连接性,请让您的服务器脚本运行其他功能。

至于将响应发送回连接的客户端,请使用stream_socket_recvfrom($socket, $length, 0, $peer)而不是fread()

然后在客户端添加一个响应监听器:

客户端.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);

服务器.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'

于 2014-07-09T15:49:37.983 回答
1

来自http://php.net/stream_socket_accept

接受先前由 stream_socket_server() 创建的套接字上的连接。

这意味着它等待一个客户端想要连接。(您只需将自己绑定到端口,但不要连接任何东西)

fread 也是与 socket_* 函数一起使用的错误函数。正确的函数是 stream_socket_recvfrom()。


但这真的不是你想要的。您似乎想打开与某个地方的连接。所以 fsockopen() 是正确的函数:

$conn = fsockopen("127.0.0.1", 22, $errno, $errstr);
if (!$conn) {
  echo "$errstr ($errno)<br />\n";
} else {
  echo fread($conn, 26);
  fclose($socket);
}
于 2013-08-28T00:58:14.543 回答