作者usherII (阿达)
看板PHP
标题[请益] 请教socket_recv收讯息不完整问题
时间Sat Aug 17 13:01:09 2013
小的PHP经验不超过半年!
虽然问题解决了 但是想请教熟的人这到底是啥原因 以及比较好的做法为何?
先感谢~~ <(_::_)>
首先已确定透过socket送给我PHP程式讯息的Server确实是一大包讯息一次送出
问题一开始是我发现透过像这样的方法收讯息
if (($bytes=
socket_recv($socket,
$buf,
$dataLength,
MSG_WAITALL))!==false)
{
if ($bytes < $dataLength)
{
// 写log纪录讯息不完整
}
// 把收到的讯息
$buf转送回介面前端
echo
$buf;
}
==
$dataLength 是我透过带在讯息前面的Header知道後面资料有多长
常常会发生, 比如长度说是
12345
但是我只有收到不完整的
4200或者
9600之类的
所以我想请教的第一个问题是
是甚麽原因让
socket_recv参数带
MSG_WAITALL却收到一半就吐给我?
接下来我因为没有收到全部讯息
所以我把Code改成这样
$timeoutLimit = 5; // 5s
$startTime = time();
// 读取资料
while (true)
{
if (($bytes=
socket_recv($socket,
$buf,
$dataLength,
MSG_WAITALL))!==false)
{
$backMsg = $backMsg . $buf;
}
if (
strlen($backMsg) >= $dataLength)
{
break;
}
elseif (
(time() - $startTime) > $timeoutLimit)
{
// Timeout 将现有的资料回传.
WriteToLog('[Timeout: ....... ');
break;
}
}
echo
$backMsg;
就可以收到全部资料再回传了
我的第二个问题是 有比较好或者说比较正确的做法吗?
非常感谢!!!
--
◢ . ______ ◣ ◣ ◢
◣ ◢ ◢ ◥█◣▲◢█◤ ◣
◥ ◥ ● │GRAVEYARD. \‧◣ ◥ █
◣◢
█ ◤ ◢ ◢◤◥█◤◥◣ ◤ ◤
' \ BILE DEMON│ '◣ ◥◥
▌◤◤ ◢ ◢▌ ◣▽◢▌ ◣
▄ ▄ ̄ ̄ ̄ ̄ ̄ ̄ ◤ ◢
█▌ ◣ ◥ ▎ ◥▌ ◤ ▊
◢◢ ▌ //\ ●● ◣◥◥ ◤
◥ ◤◤◢ ◥◥ ︵ ◤◤ ◣◣
◥ ▃▇ ▆◣▂◢▂▅≡█▄ ◣ USHER ◢ Ⅲ◥◢▅◣◤Ⅲ ◤
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 175.182.40.103