php - tcp 消息不完整

标签 php linux tcp centos

我正在使用 html5 websockets,dev.w3.org/html5/websockets/,以及 php 套接字函数,php.net/manual/en/ref.sockets.php。我的问题是使用 websockets 从客户端发送到服务器的消息被截断为最大 1449 字节。当我将 net.ipv4.tcp_timestamps 设置为 0 时,会收到几个额外的字节。我正在使用 socket_recv。我确实尝试遍历 socket_recv,但在第一次调用 socket_recv 后,发出以下警告:

Warning: socket_recv(): unable to read from socket [11]: Resource temporarily unavailable in [file] on line 94

注意:

  • 当我将 socket_recv() 与 MSG_DONTWAIT 一起使用时,我收到了上述警告。例如socket_recv($socket, $data, 10024, MSG_DONTWAIT)
  • 如果我只使用 0,系统会阻塞。例如socket_recv($socket, $data, 10024, 0)

那么,为什么发送的消息被截断了?

我的 sysctl.conf:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 900
net.ipv4.tcp_fin_timeout = 20
net.core.netdev_max_backlog = 2500


net.core.rmem_default = 262144
net.core.wmem_default = 262144

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384

net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_wmem = 8192 65536 16777216

net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.udp_mem = 8388608 12582912 16777216

net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_window_scaling = 1

最佳答案

好吧,事实证明我必须在每个给定套接字的 socket_recv() 之后再次调用 socket_select()

关于php - tcp 消息不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4019403/

相关文章:

java - 如何让Java Swing应用程序在windows和linux中有一致的字体?

.net - 最佳缓冲区大小 - TCP

C++ Yahtzee 通过 TCP

javascript - 通过ajax发送DOM

javascript - 存储用作网站新闻部分的 DOM 元素

由于执行新的应用程序,Python 操作系统命令无法正常工作

如果数据大小超过 1074 字节,则 TCP 消息在 Win7 中被分段(拆分)

javascript - 将多个标签从 PHP/Web 应用程序打印到 Dymo LabelWriter 450 Turbo

用于长时间运行 MySQL 操作的 PHP Ajax jQuery UI 进度条

c - 服务器没有在预期的位置监听