php - php中的可变长度数据包

标签 php sockets

我正在接收通过 UDP 发送到我的服务器的数据包。我正在使用 socket_read 来读取数据,并且一切正常。但是我遇到了一个错误。在我的例子中,socket_read 的长度参数并不总是相同的。数据的长度可以在 50-150 字节之间的任何范围内。保持不变的一件事是数据集以\x00 字节结尾。在遇到这个字节之前,如何让读取函数始终读取?我已经尝试过 PHP_NORMAL_READ 标志,但文档说它只以\n 或\r 结尾,这真的不是我想要的(试过它对我的数据不起作用)。同时,socket_read 的 php 页面在 length 参数描述中指出,

The maximum number of bytes read is specified by the length parameter. Otherwise you can use \r, \n, or \0 to end reading (depending on the type parameter, see below).

类型没有说明/0 字节。就像缺少一份文档一样。我需要的是一个函数,它要么让我为我的数据指定一个分隔符,要么自动从可用的套接字中读取所有数据。 socket_recv 函数中可能有一个解决方案,但它没有记录,我不知道它是如何工作的。

提前致谢。

最佳答案

如果我没理解错的话,你想从套接字中读取数据,直到没有更多数据可读,问题是数据量是可变的,你不知道什么时候停止。

根据相关手册页 ( http://php.net/socket_read ):

Note: socket_read() returns a zero length string ("") when there is no more data to read.

您应该能够通过逐字节读取直到遇到零长度字符串来处理可变长度数据:

while (($currentByte = socket_read($socket, 1)) != "") {
    // Do whatever you wish with the current byte
}

关于php - php中的可变长度数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493487/

相关文章:

php - 你如何从ssh运行一个php文件?

php - Laravel 5 - SQLSTATE [22P02] - postgres 的无效文本表示

php - 如何将连接表的结果实体封装在 Doctrine 中的另一个实体中?

iOS 套接字 : communication with Maya

php - socket.io 轮询返回 Laravel 500 NotFoundHttpException

android - 如何在android中通过套接字建立客户端到客户端的语音通话

php从sql数据库读取数据

php - 是否应该在PHP中使用$ this-> var声明和访问方法属性?

java - 从服务器向客户端发送消息

Node.js 在 Express 框架中使用 setKeepAlive()