【问题标题】:Unable to increase Socket buffer size using socket_recv无法使用 socket_recv 增加 Socket 缓冲区大小
【发布时间】:2012-10-06 15:04:10
【问题描述】:

我已经成功创建了一个 web-socket 连接并且能够正确地发送和接收数据。但是,我无法增加套接字接收缓冲区的大小。

通过使用下面的代码,我可以将接收字节限制为 1000 到更少。

$bytes = socket_recv($socket,$buffer,2048,0);

但是,当我尝试将其长度增加到 65536 字节时,它并没有增加。 我正在使用下面提到的凭据来创建 Web 套接字连接。

set_time_limit ( 0 ) ;
ob_implicit_flush ( ) ;
$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");
socket_bind($master, $address, $port) or die("socket_bind() failed");
socket_listen($master,20) or die("socket_listen() failed");

【问题讨论】:

    标签: php websocket


    【解决方案1】:

    flags 参数中使用MSG_WAITALL 选项告诉它在收到len 字节之前不要返回。

    【讨论】:

    • 先生,我试过了,但是使用它我的程序卡住了,握手过程没有完成..
    • 如果客户端不打算一次发送所有 64KB,你不能用这个握手。你想解决什么问题?
    • 实际上我想了解更多关于 HTML5 websocket 的信息,目前我没有在我的应用程序中使用它,但将来我会尝试这个.... 现在我正在尝试创建一个小型 web 应用程序/page 我可以使用 WS 协议发送我所有的 HTML 内容,所以通过试验,我可以将大型 HTML 内容发送到 Web 浏览器,但无法在服务器端接收,我认为如果工作我的应用程序将非常快并且实时。
    【解决方案2】:

    为什么要将缓冲区增加到 64KByte?我敢肯定,在大多数情况下,这没有多大意义。套接字缓冲区的最大大小当然也取决于底层实现。也许有一个您不能超过的内部最大尺寸。 如果您想接收更大的数据/消息,您应该多次使用socket_recv 函数调用。

    顺便说一下,如果你使用 PHP,你应该看看一些强大的框架。我认为尝试使用 RAW 套接字不是一个好主意。

    【讨论】:

    • 先生,我试图在循环中检索数据,但是当我这样做时,我的数据被损坏了。它返回给我一些字节,其余的都是空白。
    • 请记住,socket_recv 返回读取的字节数。之后你不能尝试访问缓冲区的某些部分,它们是无效的。
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多