【问题标题】:socket_read() returns only headers, not the actual responsesocket_read() 仅返回标头,而不是实际响应
【发布时间】:2016-06-17 23:09:14
【问题描述】:

我在跑步

$data = socket_read($socket, 2048, PHP_BINARY_READ);

应该返回这样的字符串

// $data == ' 1840 kg G 008765 A '

但它会返回

Original response: HTTP/1.1 200 OK
Date: Wed, 19 Feb 2003 09:00:00 GMT
Server: MoxaHttp/1.0
Pragma: no-cache
Cache-Control: no-cache
Content-type: text/html
Content-length: 450

这看起来像返回的数据的标题。

socket_send 配置正确,我们有其他设置相同的客户端,它们返回正确的值。

你能说一下有什么问题吗,为什么我没有得到预期的字符串?

更新:

我多次重复 socket_read() 来读取完整的字符串:

Original response: HTTP/1.1 200 OK
Date: Wed, 19 Feb 2003 09:00:00 GMT
Server: MoxaHttp/1.0
Pragma: no-cache
Cache-Control: no-cache
Content-type: text/html
Content-length: 450
Set-Cookie: ChallID=1656
<HTML><HEAD><TITLE>NPort Web Console</TITLE></HEAD> <FRAMESET rows=57,1* frameborder=NO> <FRAME name=top scrolling=NO target=contents src=top.htm noresize> <FRAMESET cols=200,*> <FRAME name=contents target=main src=contents.htm> <FRAME name=main src=main.htm marginwidth=0 marginheight=0 scrolling=auto> </FRAMESET> <NOFRAMES><BODY background=bg.gif><P>This page uses frame, but your browser doesn't support.</P></BODY> </NOFRAMES> </FRAMESET></HTML>

所以看起来它返回了一些不同的东西,应该被其他程序读取。

【问题讨论】:

  • 如果我错了,请纠正我:您是否尝试连接到特定主机、发送请求并期望得到答复?我问这个的原因是因为您初始化$socket 的部分不包含在您的问题中。
  • @Fin 是的,好的。初始化是常规的 -​​ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($socket, $host, $port); socket_send($socket, chr(005), strLen(chr(005)), 0);
  • 因此,如果我理解正确,不同机器(但一台)上的相同代码仅从一台主机返回相同的结果。那台出现问题的机器上的网络配置怎么样?它可以配置不同吗?或者可能是阻止某些东西的路由器/防火墙?
  • @Fin 是的,所有其他机器工作正常,也许它们的配置不同,我只是好奇问题出在哪一部分,是我的 PHP 代码还是设备端的东西。
  • 这是您在读取套接字之前发送到服务器的内容。您要么发送格式错误的请求,要么将其发送到错误的 URL。或者,服务可能希望请求中出现特定的用户代理。

标签: php sockets


【解决方案1】:

你试过了吗?:

echo "Reading response:\n\n";
$buf = 'This is my buffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
    echo "Read $bytes bytes from socket_recv(). Closing socket...";
} else {
    echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2020-09-25
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多