2706

php的socket编程中socket_recv函数的应用

乐果   发表于   2015 年 01 月 24 日 标签:PHP

这两天在研究golang与php之间以socket通信,golang作为服务端,php作为客户端。

当传递普通数据时,php以socket_read接受数据一点问题都没有,但当服务端发送一张图片(二进制流)时,就会出现问题。

查看文档才发现,socket_read($socket, $len, PHP_NORMAL_READ)的第三参数不对,PHP_NORMAL_READ是用来接受字符数据,要改成PHP_BINARY_READ才能接收二进制流。

果断改成socket_read($socket, $len, PHP_BINARY_READ)后,然后再抛出到浏览器,果然可以显示图片了,兴奋了一下,但又发现了问题:浏览器显示图片时不时只显示一部分就断了。

图片随机性的只显示一部分,检查了流程都没问题。最后还是查官方文档,终于发现socket_recv函数:

(PHP 4 >= 4.1.0, PHP 5)
socket_recv — Receives data from a connected socket

说明

int socket_recv ( resource $socket , string &$buf , int $len , int $flags )
The socket_recv() function receives len bytes of data in buf from socket. socket_recv() can be used to gather data from connected sockets. Additionally, one or more flags can be specified to modify the behaviour of the function.

buf is passed by reference, so it must be specified as a variable in the argument list. Data read from socket by socket_recv() will be returned in buf.

其中,最后一个参数$flags要特别注意,先记录如下,以备国人知晓:

0x1 :数据应该带外发送,所谓带外数据就是TCP紧急数据

0x2 :使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。

0x4 :不要将包路由出去。

0x8 :数据完整记录

0x100 :数据完整处理

我从socket_recv($socket, $buf, $len, 0x1)一直测试到socket_recv($socket, $buf, $len, 0x100),最终确定用0x100才可以。

OK,问题解决了。

乐果   发表于   2015 年 01 月 24 日 标签:PHP

0

文章评论